随笔 - 99  文章 - 2 评论 - 901 trackbacks - 17
<2007年4月>
25262728293031
1234567
891011121314
15161718192021
22232425262728
293012345


转载请保留链接。
国家体育场(鸟巢)是建筑史上的令人惊叹之作,杂乱的基础结构组成了一个和谐的整体,正是中国社会的成功写照。 7-18 17:44

与我联系

常用链接

留言簿(11)

我参与的团队

我的标签

随笔分类

随笔档案

文章分类

相册

最新随笔

搜索

  •  

积分与排名

  • 积分 - 141203
  • 排名 - 243

最新评论

阅读排行榜

评论排行榜

60天内阅读排行

我们在开发系统的时候,经常会遇到系统需要权限控制,而权限的控制程度不同有不同的设计方案。

 

1.       基于角色的权限设计

这种方案是最常见也是比较简单的方案,不过通常有这种设计已经够了,所以微软就设计出这种方案的通用做法,这种方案对于每一个操作不做控制,只是在程序中根据角色对是否具有操作的权限进行控制;这里我们就不做详述

2.       基于操作的权限设计

这种模式下每一个操作都在数据库中有记录,用户是否拥有该操作的权限也在数据库中有记录,结构如下:


但是如果直接使用上面的设计,会导致数据库中的
UserAction这张表数据量非常大,所以我们需要进一步设计提高效率,请看方案3

 

3.       基于角色和操作的权限设计


如上图所示,我们在添加了
Role,和RoleAction表,这样子就可以减少UserAction中的记录,并且使设计更灵活一点。

但是这种方案在用户需求的考验之下也可能显得不够灵活够用,例如当用户要求临时给某位普通员工某操作权限时,我们就需要新增加一种新的用户角色,但是这种用户角色是不必要的,因为它只是一种临时的角色,如果添加一种角色还需要在收回此普通员工权限时删除此角色,我们需要设计一种更合适的结构来满足用户对权限设置的要求。

 

4.       2,3组合的权限设计,其结构如下:


我们可以看到在上图中添加了
UserAction表,使用此表来添加特殊用户的权限,改表中有一个字段HasPermission可以决定用户是否有某种操作的权限,改表中记录的权限的优先级要高于UserRole中记录的用户权限。这样在应用程序中我们就需要通过UserRoleUserAction两张表中的记录判断权限。

到这儿呢并不算完,有可能用户还会给出这样的需求:对于某一种action所操作的对象某一些记录会有权限,而对于其他的记录没有权限,比如说一个内容管理系统,对于某一些频道某个用户有修改的权限,而对于另外一些频道没有修改的权限,这时候我们需要设计更复杂的权限机制。

 

5.       对于同一种实体(资源)用户可以对一部分记录有权限,而对于另外一些记录没有权限的权限设计:


对于这样的需求我们就需要对每一种不同的资源创建一张权限表,在上图中对
ContentChannel两种资源分别创建了UserActionContentUserActionChannel表用来定义用户对某条记录是否有权限;这种设计是可以满足用户需求的但是不是很经济,UserActionChannelUserActionContent中的记录会很多,而在实际的应用中并非需要记录所有的记录的权限信息,有时候可能只是一种规则,比如说对于根Channel什么级别的人有权限;这时候呢我们就可以定义些规则来判断用户权限,下面就是这种设计。

 

6.       涉及资源,权限和规则的权限设计


在这种设计下角色的概念已经没有了,只需要
Rule在程序中的类中定义用户是否有操作某种对象的权限。

以上只是分析思路,如果有不对的地方,请大家指正。

posted on 2007-04-15 15:58 玉开 阅读(7258) 评论(43)  编辑 收藏 所属分类: 数据库软件设计

FeedBack:
#1楼  2007-04-15 16:10 aspnetx      
这种表达方式最简洁明了了
  回复  引用  查看    
#2楼  2007-04-15 16:14 傻子 [未注册用户]
不错,好东西
  回复  引用    
#3楼 [楼主] 2007-04-15 16:59 玉开      
@傻子
@aspnetx
大家有什么好的想法,设计说一下呀

  回复  引用  查看    
#4楼  2007-04-15 18:12 狂图      
直接看Rbac理论
  回复  引用  查看    
很好
  回复  引用  查看    
#6楼  2007-04-15 19:44 aspnetx      
@玉开
对于3,我经常用,在用户对权限的需求不是很变态的情况下
对应于4, 和微软windows里用户和组的方式一样,也就是既可以对一个组授权,也可以对一个用户授权.验证操作权限的时候就要跑两个表.
5和6就没接触过这么复杂的了
  回复  引用  查看    
#7楼 [楼主] 2007-04-15 20:05 玉开      
@狂图
多谢推荐
  回复  引用  查看    
#8楼 [楼主] 2007-04-15 20:05 玉开      
@aspnetx
5,6对于同一种事物有了不同的权限设置,是更复杂了一些
  回复  引用  查看    
#9楼  2007-04-15 20:08 双鱼座      
给个提示,其实你还可以这样(替换你的方案4):

  回复  引用  查看    
#10楼 [楼主] 2007-04-15 20:19 玉开      
@双鱼座
你的方法是通过定义UserGroup,然后给UserGroup授权,对吗?

btw,你画的图真漂亮,不知道是什么画的。
  回复  引用  查看    
#11楼  2007-04-15 21:33 提问 [未注册用户]
想知道6的实践案例!!!
  回复  引用    
#12楼  2007-04-15 21:42 提问 [未注册用户]
@双鱼座
阁下的方案好像还是不能很好的解决临时特殊用户的资源访问授权,是不是还是如博主的直接设置user来的实在,请赐教。
  回复  引用    
#13楼 [楼主] 2007-04-15 22:02 玉开      
@提问
举个例子,比方说我们要为一个公司做一个系统,在公司中每一个员工都有一个职位,对于每一个员工都可以通过职位和权限判断出员工是否有操作某个事物的权限,例如:员工A是项目部经理系统规定他可以直接审批合同交易金额在200万以下的合同交易;这就是一种规则,在程序中表达是

有这样一个类
public class ContractRule:Rule
{
//实现这种规则的代码
public override bool HasPermission(Guid userID,Guid contractID){}
}
而在数据库中记录情况是在ActionRule表中添加一条记录,这条记录中记录了上面这个类的全名和所在程序集;还需要在Action这张表中添加一条修改合同的Action;这样就可以在执行这条action的时候通过反射得到对应的规则实例计算用户是否有权限在指定的合同编号的合同上面执行操作。
  回复  引用  查看    
#14楼  2007-04-15 23:50 双鱼座      
@玉开
principal只是抽象的权限所有者,user和group都是principal的派生类。无论是user还是group都可以单独获得权限。此图是一个典型的鱼尾ER图,用visio所画。
@提问
给user授权或者给group授权都是通过给principal授权来解决的。哪里不够实在了?相反,这是最灵活的方案。当然,如果需要涉及与资源相关的授权,这个方案是不够的。所以我的方案仅仅对应楼主的方案4,我已经有说明。对于与资源相关的授权,的确需要涉及到复合主键:被授权者、权限、权限相关的资源。不过我也有对应的解决方案。
  回复  引用  查看    
有没有现成的程序框架。

  回复  引用    
#16楼 [楼主] 2007-04-16 09:02 玉开      
@挺不错的
目前没有,如果说有那就是微软实现的那个了
  回复  引用  查看    
#17楼 [楼主] 2007-04-16 09:03 玉开      
@双鱼座
你的方式确实要更灵活一点,第一次听说鱼尾ER图,有空研究一下。

另外非常想看一下你的对于资源的授权的解决方案。
  回复  引用  查看    
#18楼  2007-04-16 10:55 David.Fan      
@玉开
博主,对于6有没有代码实现呢?
  回复  引用  查看    
#19楼 [楼主] 2007-04-16 11:13 玉开      
@David.Fan
抱歉了,代码涉及到商业秘密,属于公司的代码,我不好公布的,其实很简单的,没有什么难点。

如果你有什么问题,请提出来。
  回复  引用  查看    
#20楼  2007-04-16 11:51 e表      
收藏!!( .net报表工具,web报表,报表设计器,.net报表,web打印,excel,报表开发,报表控件,纯.net写的web报表开发工具在: http://www.fcsoft.com.cn/webreport.htm )
  回复  引用  查看    
#21楼  2007-04-16 12:41 木野狐      
5 是用的最普遍的情况。我见过的大多客户都比较变态。
  回复  引用  查看    
#22楼  2007-04-16 12:55 Clark Zheng      
为什么没人写一下rbac简介+进阶+.net下的实现例子呢
  回复  引用  查看    
#23楼 [楼主] 2007-04-16 13:01 玉开      
@木野狐
我觉得6可以实现5所能实现的功能,不过结构上会更复杂一些,效率上会高一些。
@Clark Zheng
你写一下呀, Zheng
  回复  引用  查看    
#24楼  2007-04-16 13:04 Clark Zheng      
@玉开
我不会呀,现在想用这个东西,东查西看的。。。如果有人能写个完整一点的,偶就受益喽
  回复  引用  查看    
#25楼 [楼主] 2007-04-16 13:10 玉开      
@Clark Zheng
这东西没有什么难点吧?

你可以把你遇到的难点列出来,大家一起分析一下。
  回复  引用  查看    
#26楼  2007-04-16 13:24 Clark Zheng      
@玉开
哈,博主即时在线呀。

我的难点主要在于,关于权限管理的权限怎么做呢?也就是说我实现了一个权限系统,那个这个系统的权限应该如何维护呢?
ps:这个权限系统里的数据非常多需要有专门的很多人维护,权限控制一样要求很严格
  回复  引用  查看    
#27楼 [楼主] 2007-04-16 17:12 玉开      
@Clark Zheng
你的这个问题比较邪门呀,如果是通常情况的话就把权限管理给少数系统管理员就可以了,可以定义系统管理员的权限不受权限系统约束
  回复  引用  查看    
#28楼  2007-04-16 17:58 佚名 [未注册用户]
对6 "只需要Rule在程序中的类中定义用户是否有操作某种对象的权限"
这句比较感兴趣? 能大概讲讲?
  回复  引用    
#29楼 [楼主] 2007-04-16 18:49 玉开      
@佚名
就是通过定义规则然后让程序执行规则的检查。

例如:公司规定对于工资小于等于5000的员工只需要项目经理审批就可以通过,而对于大于5000的员工需要副总经理审批,这就是一个规则,可以通过程序计算某个用户是否有权限做这个审批。
  回复  引用  查看    
#30楼  2007-04-16 19:31 Clark Zheng      
@玉开
我的问题就在于,管理权限的人很多,不是少数几个管理员,需要对管理权限的人也要进行权限控制
  回复  引用  查看    
#31楼  2007-04-21 14:40 MS的明天      
不错,学习了
  回复  引用  查看    
#32楼  2007-04-22 12:57 一味      
@Clark Zheng
我觉得可以参照SQLServer的权限设计,有权限的用户可以把自己的权限授予其他用户。
我看到过有的ERP软件有这样的权限设计,用户可以拥有再次分发权限的权限。
  回复  引用  查看    
#33楼 [楼主] 2007-04-22 16:50 玉开      
@一味
这个要取决于用户,用户说有权限的可以分发自己的权限,我们的程序才可以这样设计。
  回复  引用  查看    
#34楼  2007-04-28 17:26 Clark Zheng      
@一味
总算是有一种方法,谢谢你的建议,我再考虑一下

  回复  引用  查看    
#35楼  2007-06-22 10:42 google [未注册用户]
万用表 台式万用表 功率计 钳型表 兆欧表 弯沉仪 中控 多媒体中控 多媒体讲台 操作台 网络中控 多媒体教室 电子考场 嵌入式网络中控 服务器机柜 电视墙 班班通
  回复  引用    
#36楼  2007-06-22 10:43 万用表 [未注册用户]
@google

  回复  引用    
#37楼  2007-07-11 10:16 小马 [未注册用户]
可以参照一下Signet。是internet2的开源
  回复  引用    
#38楼  2007-07-12 13:54 林万晖 [未注册用户]
顶!。。。。。。我最近也在研究权限设计,你的思路很清晰,很好理解,受益匪浅,谢谢啊!

  不过对于这么多权限设计思路,我个人认为第四种更为全面、通用些,虽然其中也有些不足的地方,但可以加以改进,例如“Action”的操作就有些简单,仅仅只是记录了有那些操作。

  试想:如果公司业务量非常大,要操作的数据表也很多,每张数据表都有浏览、修改、新增、删除操作的话,那么“Action”表的数据量将非常大。

  数据表:50张    Action记录:50张 X 4

  我的意见是能不能在Action旁边再添加一张“详细操作表”,记录浏览、修改、新增、删除等细节操作。这样Action表和“详细操作表”的总数据量将等于:50张 + 4

  初学者,斗胆谏言,见谅!......

  希望版主能留个QQ什么的,有问题好请教。

  回复  引用    
#39楼  2007-07-28 17:24 镜涛      
不错!
  回复  引用  查看    
#40楼  2007-08-01 11:40 好 [未注册用户]
好东西
  回复  引用    
#41楼  2007-08-09 10:23 鸟人 [未注册用户]
不错啊 真是写的好 对我有很大的帮助啊 谢谢了 初学者见谅啊
  回复  引用    
很不错
  回复  引用    
@双鱼座

关注对于资源授权的解决方案
  回复  引用    

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2007-04-15 18:02 编辑过
 
另存  打印