RBAC权限管理系统设计

RBAC是什么

RBAC:(Role-Based-Access Control-基于角色的权限访问控制)。在RBAC中,角色和权限关联,不同的角色一般拥有不同的权限,用户拥有一个或者多个角色,在控制一类用户的权限时,需要授权或者回收某一角色的权限,将用户-角色-权限联系起来,关系表示如下:

RBAC-2019918213812

RBAC模型及分类

RBAC模型又可以分为RBAC0、RBAC1、RBAC2、RBAC3,RBAC0是基础,而RBAC1、RBAC2、RBAC3都是基于RBAC0的升级。

1. RBAC0模型

RBAC0模型主要由用户、角色、权限组成。

  • 用户和角色的关系是多对一,每一个用户只能有一种角色;
  • 用户和角色的关系是多对多,一个用户可以有多种角色;

2. RBAC1模型

RBAC1模型基于RBAC0,引入了子角色的概念,子角色可以继承父角色的所有权限。

3. RBAC2模型

RBAC2模型基于RBAC0,对角色增加了一些限制:角色互斥、基数约束、先决条件角色、运行时互斥;

  • 角色互斥:同一用户不能分配到一组互斥角色集合中的多个角色,互斥角色是指权限互相制约的两个角色;
  • 基数约束:一个角色被分配的用户数量受限,它指的是有多少用户能拥有这个角色;
  • 先决条件角色:指要想获得较高的权限,要首先拥有低一级的权限;
  • 运行时互斥:例如,允许一个用户具有两个角色的成员资格,但在运行中不可同时激活这两个角色;

4. RBAC3模型

综合了RBAC0、RBAC1、RBAC2的所有特点。

RBAC0 用户-角色-权限设计方案

本文主要说明RBAC0模型的设计方案,其余三种升级版模型请自行拓展升级。

简单的权限管理系统由五张表组成:用户表、角色表、权限表、用户-角色关系表、角色-权限关系表,示例如下:
RBAC-简单表结构-201991821560

附件

建表脚本如下:

用户表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
create table SYS_USER
(
USER_ID varchar(36) not null comment '用户ID',
NICKNAME varchar(50) comment '昵称',
NAME varchar(50) comment '姓名',
SEX varchar(10) comment '性别',
BIRTH datetime comment '出生日期',
AGE int(3) comment '年龄',
AGE_TYPE varchar(10) comment '年龄类型',
ICON varchar(200) comment '头像',
PHONE varchar(20) comment '手机',
EMAIL varchar(30) comment '邮箱',
ADDRESS varchar(30) comment '地址',
LEVEL char(2) not null comment '用户级别-0:普通用户;1:管理员;2:超管
见字典表',
SIGNATURE varchar(300) comment '个性签名',
BRIEF varchar(300) comment '个人简介',
ACTIVE boolean not null default 1 comment '激活状态-1:启用;0:禁用',
UPDATE_TIME timestamp not null default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '[系统]更新时间',
CREATE_TIME timestamp not null default CURRENT_TIMESTAMP comment '[系统]创建时间'
);

角色表

1
2
3
4
5
6
7
8
9
10
11
12
create table SYS_ROLE
(
ROLE_ID varchar(36) not null comment '角色ID',
ROLE_NAME varchar(50) not null comment '角色名称',
ROLE_KEY varchar(200) comment '角色标识',
COMMENT varchar(250) comment '描述',
ORDER_NO int not null comment '显示顺序',
TYPE tinyint not null default 2 comment '角色类型-1:系统;2:用户',
ACTIVE boolean not null default 1 comment '激活状态-1:启用;0:禁用',
CREATE_TIME timestamp not null default CURRENT_TIMESTAMP comment '创建时间',
UPDATE_TIME timestamp not null default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP comment '更新时间'
);

权限表(菜单表)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
create table SYS_MENU
(
MENU_ID varchar(36) not null comment '菜单ID',
MENU_NAME varchar(50) not null comment '菜单名称',
LINK varchar(100) comment '链接',
PCODE varchar(36) comment '父级ID',
ICON varchar(100) comment '图标',
ICON_TYPE tinyint comment '图标类型:class;图片',
COMMENT varchar(250) comment '描述',
OPEN boolean not null default 1 comment '打开-1:打开;0:关闭;没有子级菜单的该字段无效',
OPEN_TYPE tinyint comment '打开方式-1:主容器打开',
ACTIVE boolean not null default 1 comment '激活状态-1:启用;0:禁用',
LEVEL int comment '级别',
TYPE tinyint not null default 2 comment '菜单类型-1:系统;2:用户',
ORDER_NO int comment '序号',
PERMS varchar(200) comment '权限标识',
IS_LEAF boolean not null default 1 comment '是否叶子-1:是,0:否'
);

用户-角色关系表

1
2
3
4
5
create table SYS_USER_ROLE
(
USER_ID varchar(36) not null comment '用户组ID',
ROLE_ID varchar(36) not null comment '角色ID'
);

角色-权限关系表

1
2
3
4
5
create table SYS_ROLE_RESOURCE
(
ROLE_ID varchar(36) not null comment '角色ID',
RESOURCE_ID varchar(36) not null comment '资源ID:如MENU_ID、ELEMENT_ID、FILE_ID、FUNC_ID等'
);