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