扩展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. PopupWindow计算弹出位置

    1.首先自定义PopupWindow    popWindowView= LinearLayout.inflate(context, R.layout.popupWindow,null);    po ...

  2. linux中iptables配置文件及命令详解

    转自:https://www.cnblogs.com/itxiongwei/p/5871075.html iptables配置文件 直接改iptables配置就可以了:vim /etc/sysconf ...

  3. 1.Float精度在JS的解决方法

    最近做了一个有关折扣价的计算的功能,所有的运算都是在前台通过js来做,做完之后经过手工核算发现了一个问题,当时做的一个例子是10*0.94,按照我们正常的思维,这个结果应该是9.4,但是在js中的计算 ...

  4. 风格豆腐干地方v出vccxzzxx

    ksdfjlksdjflksdjlfjsdkflj{b7a6e0i010b7b7g2i010b7b7g2i010b7b7c8i010f1j4i010e0h3i010e0h3i010b7a6c8i010 ...

  5. storm学习总结

    1.storm shell端常用指令: 提交Topologies命令格式:storm jar [jar路径] [拓扑包名.拓扑类名] [拓扑名称]样例:storm jar /storm-starter ...

  6. Postman导出Api文档

    一.最近离职要把做搞过的接口整理成文档,查了查postman好像不支持导出文档,于是写了个工具类,供大家参考! 前提你要先把postman里的接口导出来 如图: 二.所用到的包(主要Json相关的包) ...

  7. 为什么我们要使用int类型来保存时间类型的数据。

    1.如果数据保存的是timestamp类型那么,如果某个服务器系统时区配置错误,那么悲剧的是通过该服务器写入的时间都是有偏差的.  如果使用int类型保存unix时间戳的话,那么就是在前端展示的时候转 ...

  8. Appium + Java 测试 [百度地图] APP的一段简单脚本

    1. 流程 进入 app ,手动处理前段预处理,程序一直等候到达指定搜索地名页面,填入[南通大学],点击[搜索] 2. Java 脚本 // part 1: 引入需要的包 import io.appi ...

  9. C#常用工具类——Excel操作类(ZT)

    本文转载于: http://www.cnblogs.com/zfanlong1314/p/3916047.html /// 常用工具类——Excel操作类 /// <para> ----- ...

  10. ES6之命令妙用

     很多人都听说过ES6(也就是ECMAScript的新一代标准)并且对她充满了向往,下面通过一个ES6中小知识点——let命令,来解开她的神秘面纱,让大家初步认识一下ES6的语法规范.        ...