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
(
id
int(11) NOT NULL AUTO_INCREMENT,
name
varchar(32) NOT NULL COMMENT ‘用户姓名’,
password
varchar(64) NOT NULL COMMENT ‘用户密码’,
role_id
int(11) NOT NULL COMMENT ‘用户角色’,
status
tinyint(5) NOT NULL COMMENT ‘是否启用’,
sex
tinyint(5) NOT NULL DEFAULT ‘0’ COMMENT ‘0:保密 1:男 2:女’,
head
varchar(150) DEFAULT NULL,
birthday
date DEFAULT ‘1000-01-01’ COMMENT ‘生日’,
tel
varchar(20) DEFAULT ”COMMENT ‘电话号码’,
create_time
int(11) NOT NULL COMMENT ‘创建时间’,
update_time
int(11) NOT NULL COMMENT ‘更新时间’,
PRIMARY KEY (id
),
UNIQUE KEY
KEYuser_role_id
(role_id
),
CONSTRAINTuser_role_id
FOREIGN 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
(
id
int(11) NOT NULL AUTO_INCREMENT,
parent_id
int(11) NOT NULL DEFAULT ‘0’ COMMENT ‘父菜单’,
name
varchar(100) NOT NULL COMMENT ‘url地址 c+a’, (控制器/方法)
title
varchar(100) NOT NULL COMMENT ‘菜单名称’,
icon
varchar(100) DEFAULT NULL COMMENT ‘图标’,
islink
tinyint(5) NOT NULL DEFAULT ‘0’ COMMENT ‘是否菜单’,
sort
int(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=’角色权限表’;