RBAC(Role-Based Access Control)基于角色的权限管理。
目前常见的RBAC方式有三种:
①文件(数组)的方式存储RBAC数据的;
②三表 (user:用户表、角色表(role)、权限表(rule));
③四表(user:用户表、角色表(role)、角色和权限对应表(role_id-rule_id)、权限表(rule));
④五表
不管是三表还是五表,原理都是一样的。
rbac有5个属性
分别是用户,角色,权限,用户角色关系(某个用户属于某个角色例如张三属于管理员角色或者属于普通用户角色),角色权限关系(某个角色对应的权限例如管理员角色拥有增删改查的权限而普通用户角色只有查的权限)
程序思路:
1、用户登录后通过用户的role_id 可以拿到所有的权限类别的id;
2、通过所有的权限列表的rule_id 可以将所有的权限列表信息取出来-》$ruleRows;
3、将取出的数据利用递归组装,方便放入导航栏中
$ruleData = [];
foreach ($ruleRows as $key => $ruleRow) {
if ($ruleRow['parent_id'] == 0) {
if (isset($ruleData[$ruleRow['id']])) {
$ruleData[$ruleRow['id']] = array_merge($ruleData[$ruleRow['id']], $ruleRow);
} else {
$ruleData[$ruleRow['id']] = $ruleRow;
}
} else {
$ruleData[$ruleRow['parent_id']]['sub'][$ruleRow['id']] = $ruleRow;
}
}
return $ruleData;
三表:用户表(user)、角色表(role)、权限表(rule)
–用户表
CREATE TABLE
user(
idint(11) NOT NULL AUTO_INCREMENT,
namevarchar(32) NOT NULL COMMENT ‘用户姓名’,
passwordvarchar(64) NOT NULL COMMENT ‘用户密码’,
role_idint(11) NOT NULL COMMENT ‘用户角色’,
statustinyint(5) NOT NULL COMMENT ‘是否启用’,
sextinyint(5) NOT NULL DEFAULT ‘0’ COMMENT ‘0:保密 1:男 2:女’,
headvarchar(150) DEFAULT NULL,
birthdaydate DEFAULT ‘1000-01-01’ COMMENT ‘生日’,
telvarchar(20) DEFAULT ”COMMENT ‘电话号码’,
create_timeint(11) NOT NULL COMMENT ‘创建时间’,
update_timeint(11) NOT NULL COMMENT ‘更新时间’,
PRIMARY KEY (id),
UNIQUE KEY
KEYuser_role_id(role_id),
CONSTRAINTuser_role_idFOREIGN KEY (role_id) REFERENCESrole(id) ON DELETE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COMMENT=’后台用户表’
– 角色表(用户组表)
drop table if exists `role`;
CREATE TABLE `role` (
`role_id` smallint(6) unsigned NOT NULL AUTO_INCREMENT,
`role_name` varchar(20) NOT NULL COMMENT '角色/用户组名称',
`role_rule_ids` varchar(128) NOT NULL DEFAULT '' COMMENT '权限ids,1,2,5,权限表中的主键集合',
`role_rule_ac` text COMMENT 'Goods-showlist,Goods-add,控制器-操作,控制器-操作,控制器-操作',
`create_time` int(11) NOT NULL COMMENT '创建时间',
`update_time` int(11) NOT NULL COMMENT '更新时间',
PRIMARY KEY (`role_id`)
) ENGINE=InnoDB AUTO_INCRE
–权限表
CREATE TABLE
rule(
idint(11) NOT NULL AUTO_INCREMENT,
parent_idint(11) NOT NULL DEFAULT ‘0’ COMMENT ‘父菜单’,
namevarchar(100) NOT NULL COMMENT ‘url地址 c+a’, (控制器/方法)
titlevarchar(100) NOT NULL COMMENT ‘菜单名称’,
iconvarchar(100) DEFAULT NULL COMMENT ‘图标’,
islinktinyint(5) NOT NULL DEFAULT ‘0’ COMMENT ‘是否菜单’,
sortint(3) NOT NULL DEFAULT ‘255’ COMMENT ‘排序’,
PRIMARY KEY (id),
UNIQUE KEYrulename(name)
) ENGINE=InnoDB AUTO_INCREMENT=80 DEFAULT CHARSET=utf8mb4 COMMENT=’权限&菜单表
创建5张表
3张实体表分别是用户表,角色表,权限表
CREATE TABLE user (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(20) NOT NULL DEFAULT ” COMMENT ‘姓名’,
email varchar(30) NOT NULL DEFAULT ” COMMENT ‘邮箱’,
is_admin tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘是否是超级管理员 1表示是 0 表示不是’,
status tinyint(1) NOT NULL DEFAULT ‘1’ COMMENT ‘状态 1:有效 0:无效’,
updated_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘最后一次更新时间’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id),
KEY idx_email (email)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’用户表’;
CREATE TABLE role (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
name varchar(50) NOT NULL DEFAULT ” COMMENT ‘角色名称’,
status tinyint(1) NOT NULL DEFAULT ‘1’ COMMENT ‘状态 1:有效 0:无效’,
updated_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘最后一次更新时间’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’角色表’;
CREATE TABLE access (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
title varchar(50) NOT NULL DEFAULT ” COMMENT ‘权限名称’,
urls varchar(1000) NOT NULL DEFAULT ” COMMENT ‘json 数组’,
status tinyint(1) NOT NULL DEFAULT ‘1’ COMMENT ‘状态 1:有效 0:无效’,
updated_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘最后一次更新时间’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’权限详情表’;
两张关系表分别是用户角色关系表,角色权限关系表。
CREATE TABLE user_role (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
uid int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘用户id’,
role_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘角色ID’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id),
KEY idx_uid (uid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’用户角色表’;
CREATE TABLE role_access (
id int(11) unsigned NOT NULL AUTO_INCREMENT,
role_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘角色id’,
access_id int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘权限id’,
created_time timestamp NOT NULL DEFAULT ‘0000-00-00 00:00:00’ COMMENT ‘插入时间’,
PRIMARY KEY (id),
KEY idx_role_id (role_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT=’角色权限表’;
本文介绍了基于角色的权限管理(RBAC)系统的基本概念及其实现方式,包括使用不同数量的表格来存储用户、角色与权限的关系,并提供了具体的表结构设计实例。
837

被折叠的 条评论
为什么被折叠?



