<2010年2月>
31123456
78910111213
14151617181920
21222324252627
28123456
78910111213

我的标签

随笔档案

宝宝孕历

  • 宝宝孕历
  • 宝宝孕历准爸爸准妈妈的好朋友-获得孕期每月每周的注意事项和温馨提示,记录宝宝诞生期间甜酸苦辣的甜蜜艰辛
  • 当当卓越比价程序
  • 用当当卓越比价程序,网上买书省钱省时。java与模式可以省10将近块钱
  • 怀孕书,育儿书,孕妇装
  • 宝宝孕历孕前准备书,怀孕书,育儿书,孕妇装,靠枕等新鲜出炉了
  • 孕期知识
  • 孕期的相关知识
  • 孕味广场
  • 孕期论坛,讨论怀孕,孕期注意事项,孕检等

美娃西西

其他

最新随笔

最新评论

阅读排行榜

评论排行榜

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

 

1.       基于角色的权限设计

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

2.       基于操作的权限设计

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


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

 

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


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

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

 

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


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

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

 

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


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

 

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


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

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

1
0
(请您对文章做出评价)
« 上一篇:看看我拍的照片,是不是很有艺术性^_^
» 下一篇:软件工程师好了歌 (转)
posted on 2007-04-15 15:58 玉开 阅读(14709) 评论(78)  编辑 收藏 网摘 所属分类: 数据库, 软件设计

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[未注册用户]
万用表 台式万用表 功率计 钳型表 兆欧表 弯沉仪 中控 多媒体中控 多媒体讲台 操作台 网络中控 多媒体教室 电子考场 嵌入式网络中控 服务器机柜 电视墙 班班通
  回复  引用    
@google

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

  不过对于这么多权限设计思路,我个人认为第四种更为全面、通用些,虽然其中也有些不足的地方,但可以加以改进,例如“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 鸟人[未注册用户]
不错啊 真是写的好 对我有很大的帮助啊 谢谢了 初学者见谅啊
  回复  引用    
很不错
  回复  引用    
@双鱼座

关注对于资源授权的解决方案

  回复  引用    
#44楼 2008-07-31 13:06 鹏鹏_Lovely      
楼主给写个示例出来看看吧,期待啊。


别用公司的代码啊,哈哈。你就自己写一个,好不好。等待……

My Eamil : dupeng0811@qq.com


谢谢。

  回复  引用  查看    
#45楼 2008-07-31 13:07 鹏鹏_Lovely      
Thanks,我不知道怎么在程序中验证权限。呜呜。郁闷。
  回复  引用  查看    
#46楼 2008-08-03 09:01 陈晨      
@双鱼座
比较喜欢这种方式
可以统一处理

  回复  引用  查看    
#47楼 2008-08-05 18:13 FreeDog      
资源不一是固定的,是可以动态添加或修改的,对于方案五,我如果动态添加一种新资源,是不是意味着要后台操作数据库动态增加两张表,
  回复  引用  查看    
#48楼[楼主] 2008-08-06 09:35 玉开      
@FreeDog
可以统一资源主键的类型,比如说都用int型,这样在就不需要再多建表了,只需要增加一个资源类型的字段就可以了;当然还需要具体问题具体分析。

  回复  引用  查看    
#49楼 2008-08-14 17:17 不错[未注册用户]
不错
  回复  引用    
#50楼 2008-12-01 16:17 寻梦E.net      
第6种方案:
“只需要Rule在程序中的类中定义用户是否有操作某种对象的权限”

在类中定义用户操作权限。那程序不是写死了。前台用户如何对权限进行配置呀。

  回复  引用  查看    
#51楼 2008-12-01 16:18 寻梦E.net      
很不解??望玉开可以给我详细地解释下。谢谢!
  回复  引用  查看    
#52楼[楼主] 2008-12-01 16:23 玉开      
@寻梦E.net
可以建立多个规则,用户可以在程序中指定使用那一种规则对应的类来实现判断权限的逻辑。

  回复  引用  查看    
#53楼 2008-12-01 16:45 寻梦E.net      
我现在正在研究上海漫索RDMS的数据库结构
其中一个组权限表中的结构和部分内容是这样的。
表base_groupperm
objecttype objectid groupid permission
Project.change.report 1 2 1
Com.chinaspis.docs.IForder 2 2 1
Com.chinaspis.docs.IForder 2 2 2


objectid 应该表示模块ID。
groupid 是组用户ID
permission是权限(1:读,2,写)

我看了很久看不到懂这里的objecttype字段是什么意思?
难道这里存储的是一个类名或程序集???



  回复  引用  查看    
#54楼[楼主] 2008-12-01 17:12 玉开      
@寻梦E.net
我给个例子,在论坛中帖子和版面是不同的类型,这里的objecttype可能就是帖子或者版面用来区分不同的权限作用对象。

  回复  引用  查看    
#55楼 2008-12-02 12:14 寻梦E.net      
谢谢。我想也是这个意思。
  回复  引用  查看    
#56楼[楼主] 2008-12-02 12:39 玉开      
@寻梦E.net
你很聪明呀。

  回复  引用  查看    
#57楼 2009-02-14 23:38 canbeing      
写得很清晰,实用
  回复  引用  查看    
写的很不错,但是看过第6种设计模式之后,感觉这样的设计在维护起来是不是很麻烦?比如:由于人与规则没有相应的关联,当原有规则的改变或者在原来权限的基础上,新添加一种规则,是不是程序就要做出相应的调整,如果是这样的化,维护起来很麻烦的了,对于规则更改比较频繁的用户。
  回复  引用    
#59楼 2009-03-16 17:56 肖蕾      
收藏,我最最近作的项目就是要用到第六种方案
  回复  引用  查看    
#60楼[楼主] 2009-03-17 15:03 玉开      
@feifeiyuan
结合设计模式应该可以找到实现符合开闭原则的方法。

  回复  引用  查看    
#61楼 2009-04-01 09:44 relax      
收藏,正在考虑权限方面的问题。
  回复  引用  查看    
#62楼 2009-05-21 10:45 渠道咨询
经典,收藏了
  回复  引用    
#63楼[楼主] 2009-05-21 14:29 玉开      
窃喜,两年前的文章还有人看
  回复  引用  查看    
@玉开
文章好不好不在于写得有多好,也不在于时间相隔多远,而在于大家讨论的思路,我主持开发的工作流平台里面的组织控制模型,就可以实现较灵活的组织+权限的问题!!!

  回复  引用  查看    
@dictator_昌
对于这样的一个关于权限的控制:
一、 管理系统
(一) 帐号管理
1. Admin
最高管理权限,拥有以下所有帐号之权限
2. 省(市)卫生局管理帐号(由admin新建)
(1) 新建、修改,删除
(2) 查询,排名,打印各医院状况
(3) 输入监控帐号(命名方式由客户提供)、密码
3. 省(市)卫生局监控帐号(由admin新建)
(1)查询,报表统计,打印各医院状况
4. 医院终端管理帐号(由admin新建)
(1) 新建、修改、删除
(2) 查询,打印本医院状况报告
(3) 输入人员帐号(命名方式由客户提供)、密码
5. 医院终端输入人员(由客户以企业账号新建)
(1) 新建、修改、删除
(2) 录入系统要求内容(或导入数据)
(3) 帐号(命名方式由客户提供)、密码
6. 医院终端查询管理帐号(由客户以企业账号新建)
(1) 提供多种查询方式
(2) 打印报表
(二) 权限管理
1. 权限分为终端输入、生成报告,查询报告、打印报告、报表统计,帐号管理,模块管理


哪位大侠能指点一下,我该怎么做呢,现在做的东西要用到这个,查了好多,但不知道从何入手。。郁闷 ING……

  回复  引用    
这个不会是太难!!!
  回复  引用  查看    
@用爱用心追梦
能具体说一下吗?如果你觉得可以的话。

  回复  引用    
@dictator_昌
不要设置Admin为最高权限,拥有全部权限
它只是个“太监”就可以了
分为:模块表、功能表和操作表基本可以解决这个问题!!!

  回复  引用  查看    
@用爱用心追梦
你说的我不太明白。。

用户,角色,权限,以及它们之间的关系。。不是这样分配的吗?

五张表。。。。

针对所发的内容,里面有个账号管理这个父权限,其下还有子权限,如:增,删,改,查等。。。
如果把所有的父权限和子权限放在一张表里的话,权限表里的数据量会很大,如果用户到达一定数量了。。

在查询的时候就是个问题了。。

要解决这个问题,是不是应该像上面有个哥们说的那样,把子权限单独放在属于某一父权限的表里。。。

如果这样的话,有几个父权限,就得有几个子权限,是不是很乱?


  回复  引用    
@dictator_昌
RBAC权限模型可以完全解决这个问题!!!

  回复  引用  查看    
@dictator_昌
能够应用解决问题就可以了,没有绝对的易用、标准!!!

  回复  引用  查看    
@用爱用心追梦
嗯,说的也是,要灵活运用。
我觉得第四种方案就可以了。。

  回复  引用    
收藏
  回复  引用  查看    
#74楼 2009-07-07 09:09 Golf[未注册用户]
这种表达方式确实非常简洁,比园子里一些大鸟直接贴代码思路更加清晰!
  回复  引用    
#75楼 2009-08-01 20:08 超级奶崽      
不错 收藏
  回复  引用  查看    
#76楼 2009-08-01 20:45 Jake.NET      
mark
  回复  引用  查看    
#77楼 2009-08-22 12:24 Cat_Lee      
菜鸟前来学习。收藏 了。
  回复  引用  查看    
#78楼 2009-09-11 10:13 真名士      
最近也要做权限了,参考一下,有问题还要请教楼主~~
  回复  引用  查看