博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
转载:用户权限角色
阅读量:6633 次
发布时间:2019-06-25

本文共 2366 字,大约阅读时间需要 7 分钟。

原文地址:

我感觉,虽然很多人都可以做出一个成员资格管理的模块,但是能做的好的并不是很多。其中,有对这个成员管理原理不清楚的,也有实现能力不强的,等等。我觉得,要想做好成员资格管理,首先必须对成员资格管理的概念和原理有较为深刻的认识。然后,有个好的设计和实现。

所以,我将在下面和大家一起讨论一下成员资格管理的概念和原理。

在成员资格管理中有3个很重要的概念:用户,角色,权限。

用户是一个在业务逻辑中存在的实体或者虚实体(不可见,但存在)。用户带有某种目的和权利。

角色是具有某些共性的用户组成的集合(这个集合允许为空)。

权限是规定了的一系列的访问规则。权限的本质是规则。是规定哪些用户可以做哪些事情,哪些用户不可以做哪些事情的规则。

比如说,只有拥有经理的角色才能查看报表。我们解析的时候是这样的:有这么一批人可以查看报表,这批人有个共同的特征,那就是他们拥有经理的角色。经理的角色特征是,在现实的业务逻辑中是经理或者拥有经理一样高的权利。

在权限中定义的是用户和事情之间的关系,并没有涉及到角色。所以,如果不使用角色也可以实现成员资格管理。但是,角色作为某些用户的集合,这样对制定规格是更为方便、合理,也更符合业务逻辑的客观存在形式。

用户和角色的优先级:

在同一个功能操作的访问权限下,一个用户被拒绝/允许,但这个用户的角色却被允许/拒绝,那这个用户到底能不能执行这个功能操作?我们给出的答案的否定的。也是就如果有明确用户可以做或不能做则按照这个规定!为什么呢,因为角色只是为了更好的组织用户,它代表了一类的用户。但是这类人中必然存在差异性,直接明确用户访问规则就是为了承认或者实现这种差异性。用户具有原子性,但是角色是由用户组成的,所以它不具备原子性。只有原子性的对象才能够保证这个访问规则的正确性。

拒绝和允许的优先级:

allow 和 deny 的优先级,到底哪个高呢?由于用户可以有多个角色,但这些角色中有些角色被一访问规则允许,有些则被禁止,有些未定义。这时,我们是让这个用户通过还是拒绝通过。我们认为应该拒绝用户的通过。正是用户角色的复杂性,所以在没有足够证据证明“里面的有些角色被拒绝但实际上这个用户不应该拒绝”的情况下,应该先把这个用户拒绝掉。这也是出于安全性的考虑。

关于企业单位中的部门设置与角色的关系:

我认为部门是一个角色,是一个和现实有密切联系的特殊角色。这个角色中包含了一系列的用户(这个部门的员工,这个部门的计算机(虚拟用户)等等) 

 

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

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

 

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

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

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

 

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

 

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

 

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

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

 

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

转载于:https://www.cnblogs.com/geling/archive/2013/04/08/3008878.html

你可能感兴趣的文章