扩展RBAC用户角色权限设计方案(转载)

扩展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招
 
 
 
posted @ 2018-10-25 16:45  hao_1234_1234  阅读(572)  评论(1编辑  收藏  举报