Title ] 关于用户角色权限管理一点想法
[Author] Pizer.Chen
[Email ] Iceant@21cn.com | iceant@vip.163.com
[Date ] 2002-11-3
----------------------------------------------------------------------------
我以前设计过一个权限系统的模型,但是我没有实现,
可以说出来,大家讨论一下。
我认为一个系统的权限部分应该由以下四个部分组成:
[*] Resource
[*] Privilege
[*] Role
[*] User
另外,一个系统中最少有这么几个角色:
[*] Creator, 也可以称做 Programmer.
[*] Administrator, 超级用户
[*] General User
----------------------
权限各部分之间的关系:
----------------------
1. Resource 就是系统的资源,比如部门新闻,文档等各种可以被提供给用户访问的对象.
2. Privilege 是 Resource Related 的权限。
什么意思?就是指,这个权限是绑定在特定的资源实例上的。
比如说部门新闻的发布权限,叫做"部门新闻发布权限".
这就表明,该 Privilege 是一个发布权限,而且是针对部门新闻这种资源的一种发布权限。
我认为,Privilege 是由 Creator 在做开发时就确定的。
3. Role, 是角色,拥有一定数量的权限。
4. User, 与 Role 相关。在我设计的系统里,User是不能与 Privilege 直接相关的,
User 要拥有对某种资源的权限,必须通过Role去关联.
----------------------
系统大串联
^_^)
----------------------
下面简单介绍一下,一个权限从开发到使用的过程.
1. Creator 创造 Privilege, Creator 在设计和实现系统时会划分,一个子系统或称为模块,
应该有哪些权限. 拿新闻这一块来说,可能应该有:
[*] 发布权限(publish)
[*] 修改权限(modify)
[*] 审核权限(review)
[*] 浏览权限(visit)
.......
这里完成的是 Privilege 与 Resource 的对象申明,并没有真正将 Privilege 与具体
Resource 实例联系在一起.
2. Administrator 指定 Privilege 与 Resource Instance 的关联.
在这一步, 权限真正与资源实例联系到了一起, 产生了 Privilege Instance。
比如,Administrator 创建了一个叫做 "部门新闻" 的Resource Instance.
?/b>缓蠼?⒉?font style='background-color:#ffff00'>权限与这个资源相关联,产生出 "部门新闻发布权限" 这个 Privilege Instance.
3. Administrator 创建一个角色,称做 "部门新闻发布者".
4. Administrator 将 "部门新闻发布权限" 赋予 "部门新闻发布者".
5. Administrator 从用户列表中选?/b>∫桓龌蚨喔鲇没В?BR> ?/b>缓蟾?庑┯没Ц秤?"部门新闻发布者" 的角色
6. User 进到系统,在它的可访问资源列表上,会出现"部门新闻发布"的链接.
7. User 点击 "部门新闻发布"的链接, 根据 Creator 的实郑?低郴峒觳?BR> [1] 当前用户是否拥有发布权限
[2] 当前用户的发布权限是否与能操作正在访问的资源.
--------------------------------------------------------------------------------------------------
Re 1:
你的方案应该行得通,但是我觉得可以再简化精练一点。
我的思路是这样。
用户角色权限,就设定用户user和角色role的对应关系,user还包括用户组group, user和group的关系树形结构的关系。
所以,在系统权限这里,我们就可以围绕角色开始定义,抛开user或组的纠缠。如你所说resource 和function(Privilege)组合成一个角色。
提供一个强大的用户权限定制系统,就要在上面两个方面提供定制:
1.可以自行增加 删除 管理resource和function之间关系。
2.可以自行设定用户user和角色role的对应关系。
以你的部门新闻发布为例:
1.某一个新闻为resource . 发布权限(publish) 修改权限(modify)等为function(Privilege),先设定好这两者关系,比如新闻+发布权限 作为一条记录存入数据库,ID就是roleID,这条记录其实就是一个角色。
2.设定user和roleID角色之间的关系,哪些user包含这个角色role。
通过权限系统框架基本设定,一个用户登陆进来,可以按上面规则检查一下。
我这里与你的区别就是,权限部分应该由以下部分组成:
Role--|-Resource
|_Privilege
User
大家可以讨论一下。
-----------------------------------------------------------------------------
Re 2:
Group 是 User 的集合.
Role 是 Privilege 的集合(应该是Privilege+resource的集合)
-----------------------------------------------------------------------------
Re 3:
对于用户直接拥有权限,我还是不建议让用户直接与权限关联
那如何解决role过多的问题?
-----------------------------------------------------------------------------
Re 4:
role不会过多,与你的设计是一对一的概念。
role可以usergroup对应起来。
role可以说是权限的集合,权限可以有很多,但role只有一个啊。
-----------------------------------------------------------------------------
Re 5:
对于role过多的问题,可以把role按类型进行分组简化管理,如:
DB
|--DBA
|--DBUser
-----------------------------------------------------------------------------
Re 6:
有关权限管理的构成已经基本解决了,接下来是如何使用权限管理?
方案:
1。象iceant 那样
------------------------------------
>>>6. User 进到系统,在它的可访问资源列表上,会出现"部门新闻发布"的链接.
>>>7. User 点击 "部门新闻发布"的链接, 根据 Creator 的实现,系统会检查
>>>[1] 当前用户是否拥有发布权限
>>>[2] 当前用户的发布权限是否与能操作正在访问的资源.
------------------------------------
这里有个问题:资源可能是分级的(树型),可否考虑过?
2。资源列表已固定,在每个资源前加判断,如果有权限则显示该资源,如果无权限则不显示;
3。资源列表已固定,在用户点击链接后加判断
------------------------------------------------------------------------------
Re 7:
你的意思是说,假如 Resource 是 tree type 的.
将 Resource 中的某个节点(非叶子节点)的权限分给用户后,
用户将拥有对该 Resource node 下的所有 child nodes 同样的权限?
这让我想起了操作系统里对文件夹权限的分配.
非常感谢你提出来的这个想法。我是没有想到~!!!
========================================================
理想的状态,当然是 2,3 一起做。
如果是我来做,因为我的视图使用的是面向对象的方式,所以,我可以做一个 View 的基类.在基类里完成 common 的 securityCheck().
其它的视图都 extend 这个 BaseView, 当需要做特殊的权限处理时,可以重写 securityCheck() 方法.
-------------------------------------------------------------------------------
仅仅摘录这一点,原文请参考 下面网址,偶没有研究.
http://www.jdon.com/jive/thread.jsp?forum=46&thread=2897&start=0&msRange=15