结合RBAC模型讲解权限管理系统需求及表结构创建
在本号之前的文章中,已经为大家介绍了很多关于Spring Security的使用方法,也介绍了RBAC的基于角色权限控制模型。但是很多朋友虽然已经理解了RBAC控制模型,但是仍有很多的问题阻碍他们进一步开发。比如:
- RBAC模型的表结构该如何创建?
- 具体到某个页面,某个按钮权限是如何控制的?
- 为了配合登录验证表,用户表中应该包含哪些核心字段?
- 这些字段与登录验证或权限分配的需求有什么关系?
那么本文就希望将这些问题,与大家进行一下分享。
一、回顾RBAC权限模型

- 用户与角色之间是多对多的关系,一个用户有多个角色,一个角色包含多个用户
- 角色与权限之间是多对多关系,一个角色有多种权限,一个权限可以属于多个角色
上图中:
- User是用户表,存储用户基本信息
- Role是角色表,存储角色相关信息
- Menu(菜单)是权限表,存储系统包含哪些菜单及其属性
- UserRole是用户和角色的关系表
- RoleMenu是角色和权限的关系表
本文讲解只将权限控制到菜单的访问级别,即控制页面的访问权限。如果想控制到页面中按钮级别的访问,可以参考Menu与RoleMenu的模式同样的实现方式。或者干脆在menu表里面加上一个字段区别该条记录是菜单项还是按钮。
为了有理有据,我们参考一个比较优秀的开源项目:若依后台管理系统。
二、组织部门管理

2.1.需求分析
之所以先将部门管理提出来讲一下,是因为部门管理没有在我们上面的RBAC权限模型中进行提现。但是部门这样一个实体仍然是,后端管理系统的一个重要组成部分。通常有如下的需求:
- 部门要能体现出上下级的结构(如上图中的红框)。在关系型数据库中。这就需要使用到部门id及上级部门id,来组合成一个树形结构。这个知识是SQL学习中必备的知识,如果您还不知道,请自行学习。
- 如果组织与用户之间是一对多的关系,就在用户表中加上一个org_id标识用户所属的组织。原则是:实体关系在多的那一边维护。比如:是让老师记住自己的学生容易,还是让学生记住自己的老师更容易?
- 如果组织与用户是多对多关系,这种情况现实需求也有可能存在。比如:某人在某单位既是生产部长,又是技术部长。所以他及归属于技术部。也归属于生产部。对于这种情况有两种解决方案,把该人员放到公司级别,而不是放到部门级别。另外一种就是从数据库结构上创建User与Org组织之间的多对多关系。
- 组织信息包含一些基本信息,如组织名称、组织状态、展现排序、创建时间
- 另外,要有基本的组织的增删改查功能
2.2 组织部门表的CreateSQL
以下SQL以MySQL为例:
CREATE TABLE `sys_org` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`org_pid` INT(11) NOT NULL COMMENT '上级组织编码',
`org_pids` VARCHAR(64) NOT NULL COMMENT '所有的父节点id',
`is_leaf` TINYINT(4) NOT NULL COMMENT '0:不是叶子节点,1:是叶子节点',
`org_name` VARCHAR(32) NOT NULL COMMENT '组织名',
`address` VARCHAR(64) NULL DEFAULT NULL COMMENT '地址',
`phone` VARCHAR(13) NULL DEFAULT NULL COMMENT '电话',
`email` VARCHAR(32) NULL DEFAULT NULL COMMENT '邮件',
`sort` TINYINT(4) NULL DEFAULT NULL COMMENT '排序',
`level` TINYINT(4) NOT NULL COMMENT '组织层级',
`status` TINYINT(4) NOT NULL COMMENT '0:启用,1:禁用',
PRIMARY KEY (`id`)
)
COMMENT='系统组织结构表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
注意:mysql没有oracle中的start with connect by的树形数据汇总SQL。所以通常需要为了方便管理组织之间的上下级树形关系,需要加上一些特殊字段,如:org_pids:该组织所有上级组织id逗号分隔,即包括上级的上级;is_leaf是否是叶子结点;level组织所属的层级(1,2,3)。
三、菜单权限管理

3.1 需求分析
- 由上图可以看出,菜单仍然是树形结构,所以数据库表必须有id与menu_pid字段
- 必要字段:菜单跳转的url、是否启用、菜单排序、菜单的icon矢量图标等
- 最重要的是菜单要有一个权限标志,具有唯一性。通常可以使用菜单跳转的url路径作为权限标志。此标志作为权限管理框架识别用户是否具有某个页面查看权限的重要标志
- 需要具备菜单的增删改查基本功能
- 如果希望将菜单权限和按钮超链接相关权限放到同一个表里面,可以新增一个字段。用户标志该权限记录是菜单访问权限还是按钮访问权限。
3.2 菜单权限表的CreateSQL
CREATE TABLE `sys_menu` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`menu_pid` INT(11) NOT NULL COMMENT '父菜单ID',
`menu_pids` VARCHAR(64) NOT NULL COMMENT '当前菜单所有父菜单',
`is_leaf` TINYINT(4) NOT NULL COMMENT '0:不是叶子节点,1:是叶子节点',
`name` VARCHAR(16) NOT NULL COMMENT '菜单名称',
`url` VARCHAR(64) NOT NULL COMMENT '跳转URL',
`icon` VARCHAR(45) NULL DEFAULT NULL,
`icon_color` VARCHAR(16) NULL DEFAULT NULL,
`sort` TINYINT(4) NULL DEFAULT NULL COMMENT '排序',
`level` TINYINT(4) NOT NULL COMMENT '菜单层级',
`status` TINYINT(4) NOT NULL COMMENT '0:启用,1:禁用',
PRIMARY KEY (`id`)
)
COMMENT='系统菜单表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
四、角色管理

上图为角色修改及分配权限的页面
4.1.需求分析
- 角色本身的管理需要注意的点非常少,就是简单的增删改查。重点在于角色分配该如何做。
- 角色表包含角色id,角色名称,备注、排序顺序这些基本信息就足够了
- 为角色分配权限:以角色为基础勾选菜单权限或者操作权限,然后先删除sys_role_menu表内该角色的所有记录,在将新勾选的权限数据逐条插入sys_role_menu表。
- sys_role_menu的结构很简单,记录role_id与menu_id,一个角色拥有某一个权限就是一条记录。
- 角色要有一个全局唯一的标识,因为角色本身也是一种权限。可以通过判断角色来判断某用户的操作是否合法。
- 通常的需求:不会在角色管理界面为角色添加用户,而是在用户管理界面为用户分配角色。
4.2.角色表与角色菜单权限关联表的的CreateSQL
CREATE TABLE `sys_role` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`role_id` VARCHAR(16) NOT NULL COMMENT '角色ID',
`role_name` VARCHAR(16) NOT NULL COMMENT '角色名',
`role_flag` VARCHAR(64) NULL DEFAULT NULL COMMENT '角色标识',
`sort` INT(11) NULL DEFAULT NULL COMMENT '排序',
PRIMARY KEY (`id`)
)
COMMENT='系统角色表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
CREATE TABLE `sys_role_menu` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`role_id` VARCHAR(16) NOT NULL COMMENT '角色ID',
`menu_id` INT(11) NOT NULL COMMENT '菜单ID',
PRIMARY KEY (`id`)
)
COMMENT='角色菜单多对多关联表'
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
五、用户管理

5.1.需求分析
- 上图中点击左侧的组织菜单树结点,要能显示出该组织下的所有人员(系统用户)。在组织与用户是一对多的关系中,需要在用户表加上org_id字段,用于查询某个组织下的所有用户。
- 用户表中要保存用户的用户名、加密后的密码。页面提供密码修改或重置的功能。
- 角色分配:实际上为用户分配角色,与为角色分配权限的设计原则是一样的。所以可以参考。
- 实现用户基本信息的增删改查功能
5.2.sys_user 用户信息表及用户角色关系表的CreateSQL
CREATE TABLE `sys_user` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`org_id` INT(11) NOT NULL,
`username` VARCHAR(64) NULL DEFAULT NULL COMMENT '用户名',
`password` VARCHAR(64) NULL DEFAULT NULL COMMENT '密码',
`enabled` INT(11) NULL DEFAULT '1' COMMENT '用户账户是否可用',
`locked` INT(11) NULL DEFAULT '0' COMMENT '用户账户是否被锁定',
`lockrelease_time` TIMESTAMP NULL '用户账户锁定到期时间',
`expired_time` TIMESTAMP NULL '用户账户过期时间',
`create_time` TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '用户账户创建时间',
PRIMARY KEY (`id`)
)
COMMENT='用户信息表'
ENGINE=InnoDB
;
CREATE TABLE `sys_user_role` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`role_id` VARCHAR(16) NULL DEFAULT NULL,
`user_id` VARCHAR(18) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
在用户的信息表中,体现了一些隐藏的需求。如:多次登录锁定与锁定到期时间的关系。账号有效期的设定规则等。
当然用户表中,根据业务的不同还可能加更多的信息,比如:用户头像等等。但是通常在比较大型的业务系统开发中,业务模块中使用的用户表和在权限管理模块使用的用户表通常不是一个,而是根据某些唯一字段弱关联,分开存放。这样做的好处在于:经常发生变化的业务需求,不会去影响不经常变化的权限模型。
期待您的关注
- 向您推荐博主的系列文档:《手摸手教您学习SpringBoot系列-16章97节》
- 本文转载注明出处(必须带连接,不能只转文字):字母哥博客。
结合RBAC模型讲解权限管理系统需求及表结构创建的更多相关文章
- API文档管理工具-数据库表结构思考.
API文档管理工具-数据库表结构思考. PS: 管理工具只是为了方便自己记录API的一些基本信息,方便不同的开发人员 (App Developer, Restful API Developer)之间的 ...
- 基于RBAC模型的权限系统设计(Github开源项目)
RBAC(基于角色的访问控制):英文名称Rose base Access Controller.本博客介绍这种模型的权限系统设计.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来 ...
- Xianfeng轻量级Java中间件平台:基于RBAC模型实现权限控制的原理
首先,白话一下RBAC模型.RBAC是基于角色的访问控制(Role-Based Access Control)的简称.RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,wh ...
- 基于RBAC模型的权限设计:如何设计系统权限体系?
一.什么是RABC RBAC(基于角色的权限控制)模型的核心是在用户和权限之间引入了角色的概念.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来间接地赋予用户权限(如下图),从而 ...
- 基于RBAC模式的权限管理系统设计概要
很多人都知道以角色为基础的权限管理设计(RBAC),但是大部分人似懂非懂,不知道完整的权限管理系统都包括哪些内容. 在此以权限管理的使用场景来说明一下完整的权限管理内容. 一是鉴权管理,即权 ...
- Cognos权限Custom Java Provider表结构实例
select * from org_user;USER_ID USER_CODE USER_NAME FULL_NAME EMAIL PWD2 889 zhangsan 张三 123@126.com ...
- EOSS V3.0 企业运营支撑系统(基于RBAC原理的权限管理)
一:EOSS 功能介绍 其于用户,角色,权限,菜单的一套“简约实用”的权限管理系统,可在其基础之上,快速进行二次开发. 一个用户可以选择多个角色. 一个角色可以选择多个权限. 一个菜单可以有无限级子菜 ...
- EOSS V3.0.2 企业运营支撑系统(基于RBAC原理的权限管理)
下载地址:https://github.com/jelly-liu/EOSS 一:EOSS 功能介绍 其于用户,角色,权限,资源(即菜单)的一套"简约有用"的权限管理系统,可在其基 ...
- OA办公软件篇(二)—权限管理
权限管理的背景 权限管理的作用 迭代历程 关键名词释义 权限管理模型 具体实现 写在最后 权限管理的背景 在OA办公软件篇(一)-组织架构一文中,我们说到组织架构是软件系统的权限体系的重要搭建依据 ...
随机推荐
- 面对对象高阶+反射+魔法方法+单例(day22)
目录 昨日内容 组合 封装 property装饰器 多态 鸭子类型 今日内容 classmethod staticmethod 面对对象高级 isinstance issubclass 反射(重要) ...
- Java基础(42)AbstractSet类
AbstractSet类的子类有HashSet(其子类是LinkedHashSet).EnumSet.TreeSet 1.HashSet public class HashSet<E> e ...
- 设计模式(二十二)Command模式
一个类在进行工作时会调用自己或者是其他类的方法,虽然调用结果会反映在对象的状态中,但并不会留下工作的历史记录. 这时,如果我们有一个类,用来表示“请进行这项工作”的“命令”就会方便很多.每一项想做的工 ...
- django-模板之过滤器Add(十三)
1.add 若前后类型不匹配,就返回空. 其他的一些过滤器: first:返回列表的第一个值: last:返回列表的最后一个值: length:返回变量值的长度: linebrakebr:将纯文本中的 ...
- accesskey附上一些实例
HTML accesskey属性与web自定义键盘快捷访问 本文地址:http://www.zhangxinxu.com/wordpress/?p=6142 可能很多小伙伴都不知道,我们只要在HTML ...
- 使用MySQL,SQL_MODE有哪些坑,你知道么?
SQL_MODE是MySQL中的一个系统变量(variable),可由多个MODE组成,每个MODE控制一种行为,如是否允许除数为0,日期中是否允许'0000-00-00'值. 为什么需要关注SQL_ ...
- xtrabackup备份原理及流式备份应用
目录 xtrabackup备份原理及流式备份应用 0. 参考文献 1. xtrabackup 安装 2. xtrabackup 备份和恢复原理 2.1 备份阶段(backup) 2.2 准备阶段(pr ...
- Android H5混合开发(2):自定义Cordova插件
前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...
- 搭建邮件服务器,使用Postfix与Dovecot收发电子邮件
小知识: 我们为什么要搭建邮件服务器呢?有时候我们处于一个局域网内,不能及时的分享各自的研究成果,迫切的需要一种能够借助于网络且建立在计算机之间的传输数据的方法.所以我们需要搭建邮件服务器,这样的话既 ...
- Web for pentester_writeup之File Include篇
Web for pentester_writeup之File Include篇 File Include(文件包涵) Example 1 加一个单引号 从报错中我们可以获取如下信息: 当前文件执行的代 ...