扩展RBAC用户角色权限设计方案

 来源:https://www.cnblogs.com/zwq194/archive/2011/03/07/1974821.html
https://blog.csdn.net/painsonline/article/details/7183613/

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系。(如下图)

角色是什么?可以理解为一定数量的权限的集合,权限的载体。例如:一个论坛系统,“超级管理员”、“版主”都是角色。版主可管理版内的帖子、可管理版内的用户等,这些是权限。要给某个用户授予这些权限,不需要直接将权限授予用户,可将“版主”这个角色赋予该用户。

当用户的数量非常大时,要给系统每个用户逐一授权(授角色),是件非常烦琐的事情。这时,就需要给用户分组,每个用户组内有多个用户。除了可给用户授权外,还可以给用户组授权。这样一来,用户拥有的所有权限,就是用户个人拥有的权限与该用户所在用户组拥有的权限之和。(下图为用户组、用户与角色三者的关联关系)

在应用系统中,权限表现成什么?对功能模块的操作,对上传文件的删改,菜单的访问,甚至页面上某个按钮、某个图片的可见性控制,都可属于权限的范畴。有些权限设计,会把功能操作作为一类,而把文件、菜单、页面元素等作为另一类,这样构成“用户-角色-权限-资源”的授权模型。而在做数据表建模时,可把功能操作和资源统一管理,也就是都直接与权限表进行关联,这样可能更具便捷性和易扩展性。(见下图)

请留意权限表中有一列“权限类型”,我们根据它的取值来区分是哪一类权限,如“MENU”表示菜单的访问权限、“OPERATION”表示功能模块的操作权限、“FILE”表示文件的修改权限、“ELEMENT”表示页面元素的可见性控制等。

这样设计的好处有二。其一,不需要区分哪些是权限操作,哪些是资源,(实际上,有时候也不好区分,如菜单,把它理解为资源呢还是功能模块权限呢?)。其二,方便扩展,当系统要对新的东西进行权限控制时,我只需要建立一个新的关联表“权限XX关联表”,并确定这类权限的权限类型字符串。

这里要注意的是,权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系。(文件、页面权限点、功能操作等同理)。也就是每添加一个菜单,就得同时往这三个表中各插入一条记录。这样,可以不需要权限菜单关联表,让权限表与菜单表直接关联,此时,须在权限表中新增一列用来保存菜单的ID,权限表通过“权限类型”和这个ID来区分是种类型下的哪条记录。

到这里,RBAC权限模型的扩展模型的完整设计图如下:

随着系统的日益庞大,为了方便管理,可引入角色组对角色进行分类管理,跟用户组不同,角色组不参与授权。例如:某电网系统的权限管理模块中,角色就是挂在区局下,而区局在这里可当作角色组,它不参于权限分配。另外,为方便上面各主表自身的管理与查找,可采用树型结构,如菜单树、功能树等,当然这些可不需要参于权限分配。

以上,是从基本的RBAC模型进行了扩展,具体的设计要根据项目业务的需要作调整。欢迎大家提出批评意见!

 
 
 
发表评论

 

#1楼 2011-04-12 01:27 | GetStart 

这是讲解最详细、让人理解最透彻的一篇文章。非常好!
如果角色组和直接角色分配也能补充上的话,更为绝妙,堪比
http://msdn.microsoft.com/zh-cn/library/dd298183.aspx

#2楼 2011-05-11 17:31 | yzhw.2008 

讲得很详细,非常容易让人理解

#3楼 2011-09-06 11:58 | zhouhappy 

要有例子就更好了!

#4楼 2012-12-07 11:26 | wanglin90 

我见过的把RBAC说的最清楚的文章

#5楼 2012-12-31 14:46 | Johnny Qian 

设计清晰,很有启示

#6楼 2013-02-03 16:59 | blindlf 

实际上,RBAC的角色也可以认为是用户组。所以多加一个单独的用户组似乎不是很必要。

#7楼 2013-07-19 16:11 | 乱78招 

权限表与权限菜单关联表、权限菜单关联表与菜单表都是一对一的关系

为什么需要一张中间表,而不是两个表直接关联????

#8楼 2013-08-23 15:31 | 岁月已走远 

@ blindlf
引用实际上,RBAC的角色也可以认为是用户组。所以多加一个单独的用户组似乎不是很必要。

同意6楼的意见,之前我也试着建立【用户组】来方便管理,后来发现实在是没有必要,你每次新建一个用户时还是要像给他/她指定角色那样去给他/她指定所属用户组;你在新建【用户组】时还得给组指定一个或多个角色,或者个性化组的权限,然后再把用户指定要组;也许你会说【用户组】可以同时包含多个角色,很方便配置...但别忘了:你也可以直接给户用指定多个角色,你也可以直接个性化用户权限,只需要绕过【角色】在【用户】和【权限】之间直接建立一个关系表(UserRightRlt)!我之前建立【用户组】,以为可以方便管理,也是受园子里某前辈的博文所影响,但实践证明,真的没有必要,【用户组】能完成的方便管理的功能其实【角色】几乎都能完成,而增加【用户组】反而会增权你权限管理模块代码的复杂性,甚至会降低系统读取用户权限时的性能,可谓得不尝失。

#9楼 2013-10-11 11:01 | David.Yun 

@ 岁月已走远
权限不就是用户组么,都是多对多的关系,为何还要搞神马权限和用户组,在用户组上面赋予权限不行么

#10楼 2013-10-11 12:11 | 岁月已走远 

@ David.Yun
我的意思就是没必要搞用户组!只是楼主觉得要搞!

#11楼 2013-10-28 13:53 | 初学者心态 

@ blindlf
引用实际上,RBAC的角色也可以认为是用户组。所以多加一个单独的用户组似乎不是很必要。
表示同感!

#12楼 2014-04-28 00:23 | yubinfeng 

@ 初学者心态
引用@blindlf引用引用实际上,RBAC的角色也可以认为是用户组。所以多加一个单独的用户组似乎不是很必要。
表示同感!
有必要,首先作者设计用户组,可能是即于比如组织机构类似的分类所用。并且作者本身没有强制要求只有用户组才可以分配角色(权限),用户本身也可以直接分配角色。假如有一种机构下所有角色赋权时,这个非常方便。用户组本身也是体现用户层级关系的一种结构。

#13楼 2014-05-07 15:39 | 李永辉 

确实很复杂啊

#14楼 2014-08-14 15:25 | wqkfly 

问一下博主,这些关系图表使用什么工具设计的

#15楼 2014-08-28 22:36 | doinnie 

@ yubinfeng
引用@初学者心态引用引用@blindlf引用引用实际上,RBAC的角色也可以认为是用户组。所以多加一个单独的用户组似乎不是很必要。
表示同感!
有必要,首先作者设计用户组,可能是即于比如组织机构类似的分类所用。并且作者本身没有强制要求只有用户组才可以分配角色(权限),用户本身也可以直接分配角色。假如有一种机构下所有角色赋权时,这个非常方便。用户组本身也是体现用户层级关系的一种结构。
同意!举例补充:现存在用户组A、B ,目前都已经分配了角色m,如果公司决定要求A(部门)有n角色的权限, 那么直接将用户组A 赋予n权限。 省却了对A组下每个用户单独设置的步骤。

#16楼 2015-07-14 20:33 | 石来方夕莉 

不错的文章啊,帮助很大,我刚刚停留在5张表的应用上,老师不教啊。

#17楼 2015-09-11 14:21 | 西安-晁州 

很不错的文章,近乎通用的权限管理设计,多谢分享

#18楼 2015-09-16 22:51 | 鱼时代 

按照上面的设计,那权限表的权限类型字段,如何设计啊,比如 :组-管理员 j组 角色-超级管理员 , 用户-root , 要操作某个菜单;很简单的场景吧! 那么,可以通过角色-权限关联表 查到权限类型,那么就必须和这个菜单的拥有权限进行匹配;那么问题就来了,这个匹配模式是什么呢?这个权限类型又要分配给页面元素、功能操作表,这就显出问题了?能给出个答案吗?

#19楼 2015-09-16 23:05 | 鱼时代 

0 代表 - 无权限
1 代表 add_qx
2 代表 del_qx 
3 代表 edit_qx
4 代表 view_qx
5 代表 execute_qx

#20楼 2016-07-04 13:37 | smtdrxm 

有没有必要设置用户组其实跟用户和实际业务有关系。
比如:用户量的多少、权限的多少、每个业务人员的个性化程度都会影响,这是实际上是涉及到管理和业务发展的问题,不仅仅是技术能解决的。

#21楼 2018-01-23 15:03 | 余昭(Ray) 

@ 乱78招
 
 
 

扩展RBAC用户角色权限设计方案(转载)的更多相关文章

  1. [转]扩展RBAC用户角色权限设计方案

    原文地址:http://www.iteye.com/topic/930648 RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地 ...

  2. 扩展RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  3. 扩展RBAC用户角色权限设计方案<转>

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  4. RBAC用户角色权限设计方案【转载】

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用户-角色- ...

  5. RBAC用户角色权限设计方案

    RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成“用 户-角色 ...

  6. 简单的RBAC用户角色权限控制

    Java web项目中,无论项目是大是小,或多或少都会涉及到用户访问权限的控制,权限管理总体的设计思路就是,不该看的不看,不该做的不做!据我目前的了解,我所知道的几种实现访问权限控制的方式有: JQu ...

  7. 学习RBAC 用户·角色·权限·表

  8. spring-boot-plus V1.4.0发布 集成用户角色权限部门管理

    RBAC用户角色权限 用户角色权限部门管理核心接口介绍 Shiro权限配置

  9. [.Net MVC] 用户角色权限管理_使用CLK.AspNet.Identity

    项目:后台管理平台 意义:一个完整的管理平台需要提供用户注册.登录等功能,以及认证和授权功能. 一.为何使用CLK.AspNet.Identity 首先简要说明所采取的权限控制方式.这里采用了基于角色 ...

随机推荐

  1. Vue笔记整理——第一天

    1.为什么学习Vue? 提高开发效率. 提高效率历程:原生js——>jq(解决兼容性)——>前端模板引擎——>Vue.js(减少DOM操作,注重数据业务逻辑). 2.框架与库的区别? ...

  2. spring 单元测试方法及其错误整理

    spring 单元测试及其错误整理 目录: NO1 spring单元测试方法 - NO1.1 pom.xml文件中确认有下面依赖 - NO1.2 在需要测试的类上,或者新建的测试类上添加注解 - NO ...

  3. Delphi Excel导入 的通用程序

    步骤: 1 连excel(自己知道其格式,最好是没个字段在数据一一对应) 2 读excel数据,填入到数据库 我这里有个函数,实现把excel表格中数据导入数据库,在一条数据导入前判断数据库中是否有该 ...

  4. spring 排除指定的类或者包扫描

    <!-- 排除Controller注解的扫描 --> <context:component-scan base-package="exampleBean"> ...

  5. 升讯威微信营销系统开发实践:订阅号和服务号深入分析( 完整开源于 Github)

    GitHub:https://github.com/iccb1013/Sheng.WeixinConstruction因为个人精力时间有限,不会再对现有代码进行更新维护,不过微信接口比较稳定,经测试至 ...

  6. KVM虚拟机配置笔记

    KVM 全称是 Kernel-Based Virtual Machine.也就是说 KVM 是基于 Linux 内核实现的,KVM有一个内核模块叫 kvm.ko,只用于管理虚拟 CPU 和内存. 在 ...

  7. 《Tornado介绍》—— 读后总结

  8. 如何阅读Java源码?

    阅读本文大概需要 3.6 分钟. 阅读Java源码的前提条件: 1.技术基础 在阅读源码之前,我们要有一定程度的技术基础的支持. 假如你从来都没有学过Java,也没有其它编程语言的基础,上来就啃< ...

  9. Android--UI之TextView

    前言 开门见山,这一篇博客主要讲一下在Android开发中,UI控件TextView的一些使用方式,并且通过四个例子实现一般项目中需要的效果来讲解TextView的使用.并且在之后的一段时间之内,都会 ...

  10. 谷歌浏览器中安装Axure扩展程序

    当使用谷歌浏览器预览Axure原型文件的时候,首次打开会出现以下界面: 我们按照图片中的步骤来即可,不过前提条件是翻.墙[我使用的是蓝灯,下载地址:https://github.com/getlant ...