进学阁

业精于勤荒于嬉,行成于思毁于随

0%

权限模型RBAC模型

什么是RBAC模型

权限是需要给对应的用户的,当用户太多的时候如果一个一个用户的设定权限就会显得很复杂,这时候我们可以引入角色,每个角色可以拥有多个权限,每个用户可以分配多个角色,这样用户就拥有了多个角色的多个权限

为什么要用RBAC模型

因为有角色作为媒介,大大降低了错综复杂的交互关系,比如一家有上万人的公司,角色可能只需要几百个就搞定了,因为很多用户需要的权限是一样的,分配一样的角色就可以了。这种模型的对应关系图如下所示:

用户和角色,角色和权限都是多对多的关系,这种模型是最通用的权限管理模型,节省了很大的权限维护成本,当然这种只是通用的模式,在实际的业务是千变万化的,比如大部分公司是分层级的,层级越高权限越大这时候可以用角色继承的RBAC模型。还有很多角色是互斥的这时候可以使用带约束的RBAC。比如同一个角色有多个用户,我们可以采用在角色的前提下增加一个用户组来简化角色分配。在pomelo中我们使用了通用的RBAC模型,这里只展示通用的模型

RBAC模型数据结构

菜单表(权限表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
P TABLE IF EXISTS customer_menu;
CREATE TABLE customer_menu(
`menu_id` varchar(32) NOT NULL COMMENT '菜单编号;菜单编号' ,
`parent_id` varchar(32) NOT NULL COMMENT '父菜单编号;父菜单编号' ,
`name` varchar(255) NOT NULL COMMENT '菜单名称;菜单名称' ,
`another_name` varchar(255) NOT NULL COMMENT '别称;别称' ,
`path` varchar(255) NOT NULL COMMENT '菜单URL;菜单地址(目录 菜单信息为/xxx/xxx 按钮为:delete,create等)' ,
`order_num` int COMMENT '显示顺序;显示顺序' ,
`component` varchar(255) COMMENT '组件路径;组件路径' ,
`perms` varchar(255) NOT NULL COMMENT '授权;授权(多个用逗号分隔,如:user:list,user:create);' ,
`type` tinyint(4) NOT NULL COMMENT '类型;类型 0:目录 1:菜单 2:按钮;' ,
`icon` varchar(255) NOT NULL COMMENT '菜单图标;菜单图标' ,
`is_full` tinyint(4) COMMENT '是否跳转;是否跳转' ,
`is_link` varchar(255) COMMENT '是否外链;是否外链' ,
`is_hide` tinyint(4) COMMENT '是否隐藏;是否隐藏' ,
`is_affix` tinyint(4) COMMENT '是否固定;是否固定' ,
`is_keep_alive` tinyint(4) COMMENT '是否长连接;是否长连接' ,
`revision` int(4) NOT NULL COMMENT '乐观锁;乐观锁' ,
`create_time` datetime NOT NULL COMMENT '创建时间;创建时间' ,
`update_time` datetime NOT NULL COMMENT '更新时间;更新时间' ,
`del_flag` tinyint(4) NOT NULL COMMENT '删除标记;删除标记' ,
PRIMARY KEY (menu_id)
) COMMENT = '菜单表';

角色表

1
2
3
4
5
6
7
8
9
10
11
12
13
DROP TABLE IF EXISTS customer_role;
CREATE TABLE customer_role(
`role_id` varchar(32) NOT NULL COMMENT '角色ID;角色ID' ,
`role_name` varchar(100) NOT NULL COMMENT '角色名称;角色名称' ,
`role_key` varchar(32) NOT NULL COMMENT '角色权限字符串;角色权限字符串' ,
`role_sort` int COMMENT '显示顺序;显示顺序' ,
`data_scope` tinyint(4) COMMENT '数据范围(1:全部数据权限 2:自定数据权限 );数据范围(1:全部数据权限 2:自定数据权限 )' ,
`status` tinyint(4) NOT NULL COMMENT '角色状态(0正常 1停用);角色状态(0正常 1停用)' ,
`revision` int(4) NOT NULL COMMENT '乐观锁;乐观锁' ,
`create_time` datetime NOT NULL COMMENT '创建时间;创建时间' ,
`update_time` datetime NOT NULL COMMENT '更新时间;更新时间' ,
`del_flag` tinyint(4) NOT NULL COMMENT '删除标记;删除标记'
) COMMENT = '角色表';

用户表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP TABLE IF EXISTS customer_user;
CREATE TABLE customer_user(
`user_id` varchar(32) NOT NULL COMMENT '用户编号;用户编号' ,
`user_name` varchar(30) NOT NULL COMMENT '用户账号;用户账号' ,
`nick_name` varchar(30) NOT NULL COMMENT '用户昵称;用户昵称' ,
`phone_number` varchar(20) COMMENT '用户手机号;用户手机号' ,
`open_id` varchar(32) COMMENT '微信Id;微信唯一标识' ,
`dy_id` varchar(32) COMMENT '抖音Id;抖音唯一标识' ,
`sex` tinyint(4) COMMENT '性别;性别(0男 1女 2未知)' ,
`avatar` varchar(100) COMMENT '头像地址;头像地址' ,
`invite_code` varchar(32) COMMENT '邀请码;邀请码' ,
`password` varchar(16) NOT NULL COMMENT '密码;密码' ,
`salt` varchar(32) NOT NULL COMMENT '盐;盐' ,
`status` tinyint(4) NOT NULL COMMENT '用户状态;账号状态(0未验证 1已验证 2已冻结 3已过期)' ,
`revision` int(4) NOT NULL COMMENT '乐观锁;乐观锁' ,
`create_time` datetime NOT NULL COMMENT '创建时间;创建时间' ,
`update_time` datetime NOT NULL COMMENT '更新时间;更新时间' ,
`del_flag` tinyint(4) NOT NULL COMMENT '删除标记;删除标记' ,
PRIMARY KEY (user_id)
) COMMENT = '用户表';

用户角色表

1
2
3
4
5
6
7
DROP TABLE IF EXISTS customer_user_role;
CREATE TABLE customer_user_role(
`ID` INT AUTO_INCREMENT COMMENT '' ,
`user_id` varchar(32) COMMENT '用户ID;用户ID' ,
`role_id` varchar(32) COMMENT '角色ID;角色ID' ,
PRIMARY KEY (ID)
) COMMENT = '用户角色表';

角色权限表

1
2
3
4
5
6
7
8
DROP TABLE IF EXISTS customer_role_menu;
CREATE TABLE customer_role_menu(
`ID` INT AUTO_INCREMENT COMMENT '' ,
`role_id` varchar(32) COMMENT '角色ID;角色ID' ,
`menu_id` varchar(32) COMMENT '菜单ID;菜单ID' ,
PRIMARY KEY (ID)
) COMMENT = '角色菜单管理表';