在本号之前的文章中,已经为大家介绍了很多关于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
;

在用户的信息表中,体现了一些隐藏的需求。如:多次登录锁定与锁定到期时间的关系。账号有效期的设定规则等。

当然用户表中,根据业务的不同还可能加更多的信息,比如:用户头像等等。但是通常在比较大型的业务系统开发中,业务模块中使用的用户表和在权限管理模块使用的用户表通常不是一个,而是根据某些唯一字段弱关联,分开存放。这样做的好处在于:经常发生变化的业务需求,不会去影响不经常变化的权限模型。

期待您的关注

结合RBAC模型讲解权限管理系统需求及表结构创建的更多相关文章

  1. API文档管理工具-数据库表结构思考.

    API文档管理工具-数据库表结构思考. PS: 管理工具只是为了方便自己记录API的一些基本信息,方便不同的开发人员 (App Developer, Restful API Developer)之间的 ...

  2. 基于RBAC模型的权限系统设计(Github开源项目)

    RBAC(基于角色的访问控制):英文名称Rose base Access Controller.本博客介绍这种模型的权限系统设计.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来 ...

  3. Xianfeng轻量级Java中间件平台:基于RBAC模型实现权限控制的原理

    首先,白话一下RBAC模型.RBAC是基于角色的访问控制(Role-Based Access Control)的简称.RBAC认为权限授权实际上是Who.What.How的问题.在RBAC模型中,wh ...

  4. 基于RBAC模型的权限设计:如何设计系统权限体系?

    一.什么是RABC RBAC(基于角色的权限控制)模型的核心是在用户和权限之间引入了角色的概念.取消了用户和权限的直接关联,改为通过用户关联角色.角色关联权限的方法来间接地赋予用户权限(如下图),从而 ...

  5. 基于RBAC模式的权限管理系统设计概要

    很多人都知道以角色为基础的权限管理设计(RBAC),但是大部分人似懂非懂,不知道完整的权限管理系统都包括哪些内容.  在此以权限管理的使用场景来说明一下完整的权限管理内容.     一是鉴权管理,即权 ...

  6. Cognos权限Custom Java Provider表结构实例

    select * from org_user;USER_ID USER_CODE USER_NAME FULL_NAME EMAIL PWD2 889 zhangsan 张三 123@126.com ...

  7. EOSS V3.0 企业运营支撑系统(基于RBAC原理的权限管理)

    一:EOSS 功能介绍 其于用户,角色,权限,菜单的一套“简约实用”的权限管理系统,可在其基础之上,快速进行二次开发. 一个用户可以选择多个角色. 一个角色可以选择多个权限. 一个菜单可以有无限级子菜 ...

  8. EOSS V3.0.2 企业运营支撑系统(基于RBAC原理的权限管理)

    下载地址:https://github.com/jelly-liu/EOSS 一:EOSS 功能介绍 其于用户,角色,权限,资源(即菜单)的一套"简约有用"的权限管理系统,可在其基 ...

  9. OA办公软件篇(二)—权限管理

    权限管理的背景 权限管理的作用 迭代历程 关键名词释义 权限管理模型 具体实现 写在最后   权限管理的背景 在OA办公软件篇(一)-组织架构一文中,我们说到组织架构是软件系统的权限体系的重要搭建依据 ...

随机推荐

  1. Markdown的基本使用指南

    目录 1.标题 2.列表 2.1无序列表 2.1有序列表 3.引用 4.图片和链接 5.粗体和斜体 6.分割线 7.代码框和代码块 8.列表 9.可选框 10.添加目录 Markdown 是一种用来写 ...

  2. StreamWriter 相关知识分享

    在介绍StreamWriter之前,我们首先来了解一下它的父类TextWriter. 一.TextWriter 1.TextWriter的构造函数和常用属性方法 下面是TextWriter的构造函数: ...

  3. 如何利用Fiddler4进行Android APP / IOS APP抓包

    Fiddler抓包 1.Fiddler介绍 Fiddler是一个http协议调试代理工具,它能够记录并检查所有你的电脑和互联网之间的http通讯,设置断点,查看所有的“进出”Fiddler的数据. F ...

  4. Rancher 2.3.2 Stable!Istio UI已经GA!生产可用!

    2019年10月9日,Rancher 2.3正式发布,这是Rancher Labs迄今为止最重要的产品版本.Rancher 2.3是业界首个GA支持Windows容器的Kubernetes管理平台,并 ...

  5. Shiro权限管理框架(四):深入分析Shiro中的Session管理

    其实关于Shiro的一些学习笔记很早就该写了,因为懒癌和拖延症晚期一直没有落实,直到今天公司的一个项目碰到了在集群环境的单点登录频繁掉线的问题,为了解决这个问题,Shiro相关的文档和教程没少翻.最后 ...

  6. javascript严格模式的影响

    针对js严格模式会报错的编码操作进行了整理,避免不严谨的代码习惯,面向未来编程(es6+) 变量 1.定义八进制格式的数字 2.不带var的变量定义--包括函数体内的 3.对变量的delete操作-- ...

  7. css过渡transition属性

    一.CSS3 过渡 (一).CSS3过渡简介 CSS3过渡是元素从一种样式逐渐改变为另一种的效果. 实现过渡效果的两个要件: 规定把效果添加到哪个 CSS 属性上 规定效果的时长 定义动画的规则 过渡 ...

  8. 汇编窥探Swift String的底层

    String(字符串),是所有编程语言中非常重要的成员,因此非常值得去深入研究.众所周知,字符串的本质是字符序列,由若干个字符组成.比如字符串 "iOS" 由 'i'.'O'.'S ...

  9. Mui 长按保存图片

    必须先要 引入 mui.js,然后参考具体代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8 ...

  10. data-*设置自定义属性注意事项一

    本人才疏学浅,偶遇一个data自定义属性应当注意的小问题,随笔记下. 1.看下面代码:首先在a标签设置自定义两个属性 <a class="btn" href="ja ...