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

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模型的设计方案,其余三种升级版模型请自行拓展升级。
简单的权限管理系统由五张表组成:用户表、角色表、权限表、用户-角色关系表、角色-权限关系表,示例如下:

附件
建表脚本如下:
用户表
| 12
 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 '[系统]创建时间'
 );
 
 | 
角色表
| 12
 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 '更新时间'
 );
 
 | 
权限表(菜单表)
| 12
 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:否'
 );
 
 | 
用户-角色关系表
| 12
 3
 4
 5
 
 | create table SYS_USER_ROLE(
 USER_ID              varchar(36) not null comment '用户组ID',
 ROLE_ID              varchar(36) not null comment '角色ID'
 );
 
 | 
角色-权限关系表
| 12
 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等'
 );
 
 |