基于角色的权限系统

 欢迎各位对一般B/S结构应用程序的权限系统发表自己的看法  
   
  顺便请教一个问题:“权限委托”这个有什么实际意义?在RBAC下如何最优化实现?  
   
  ====================部分参考资料=======================================================  
  http://csrc.nist.gov/rbac/  
   
  基于角色管理的系统访问控制  
  http://www.kupage.com/wpm/15/20030427/1259000000001fyt7hph.htm  
   
  基于角色访问控制的UML表示  
  http://www.mmmbook.com/xprogrammer/issue/25/rolebased.htm  
   
  [PDF]   一个基于角色的WEB   安全访问控制系统  
  http://www.is.pku.edu.cn/~lz/publications/webdaemon.pdf  
   
  问题点数:200、回复次数:46 Top

1 楼lstup(流水)回复于 2005-05-27 16:35:43 得分 6

第一个来咯。  
  先抢个位置。Top

2 楼liuxiaoyi666(MSMVP 小猪妹荣誉马甲之八卦兔子)回复于 2005-05-27 16:36:28 得分 6

这个问题,我快郁闷死了不要问我,我为了权限要杀人了Top

3 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-27 16:44:30 得分 0

郁闷死,我也搞了一个星期了  
  换了四次方案,还是没确定下来Top

4 楼up1002(涨不停)回复于 2005-05-27 16:52:14 得分 6

执行   操作1、操作2、操作3……   所需要的权限分别为   权限1、权限2、权限3……,  
  对应的值分别为   1、2、4、8、16   ……  
  SQL的bigint类型是64位,也就是最多可以支持存储64种权限。  
  如果你的需求超过这个数量,可以考虑用几个bigint字段共同担当存储用户权限的任务。  
   
  把一个用户所拥有的所有权限代表的数值“按位或”,得到的数字就是他的权限。  
  也就是说在某项权限对应的位上,如果是1,表示他有权限,反之0表示没有。  
  判断某用户在某操作上有无权限也很简单,只要用它的权限数字    
  按位“与”一下   该操作所需的权限所代表的数字,  
  ——得到的结果如果等于该操作所需的权限所代表的数字,表明该用户有此权限。  
   
  角色,可以预先定义一大堆权限的组合,“按位或”,得到的权限数值作为一个角色。  
  一个用户具有多个角色,再把多个角色的权限数值“按位或”。  
   
  具体说起来话太长了。就说这些不知道大家能不能明白。  
  这是我的想法。但是我没有实践过。Top

5 楼madpolice(午夜狂龙)回复于 2005-05-27 16:55:49 得分 6

我谈谈我做的"双重权限"控制,即同时使用以下两种,  
   
  1)基于角色的权限控制  
  2)基于机构的权限控制  
   
  举个例子.  
  1)我的电脑上有administrator组和guset组,不同组的用户权限不同,这就是“基于角色的权限控制”  
  2)我在我的电脑中属于administrator组,你在你的电脑中属于administrator组,但是没有权限操作我的电脑,这就是“基于机构的权限控制”  
   
   
  快下班了,简单说说。就是一方面根据操作类型划分出不同的角色,各个角色能进行不同的操作;另一方面根据机构对人员进行划分,不是本机构的人员不能查询不是本机构的数据。  
   
  Top

6 楼madpolice(午夜狂龙)回复于 2005-05-27 16:57:23 得分 6

上面少写了一个字,重新更正如下  
   
   
   
  我谈谈我做的"双重权限"控制,即同时使用以下两种,  
   
  1)基于角色的权限控制  
  2)基于机构的权限控制  
   
  举个例子.  
  1)我的电脑上有administrator组和guset组,不同组的用户权限不同,这就是“基于角色的权限控制”  
  2)我在我的电脑中属于administrator组,你在你的电脑中属于administrator组,但是你没有权限操作我的电脑,这就是“基于机构的权限控制”  
   
   
  快下班了,简单说说。就是一方面根据操作类型划分出不同的角色,各个角色能进行不同的操作;另一方面根据机构对人员进行划分,不是本机构的人员不能查询不是本机构的数据。Top

7 楼lstup(流水)回复于 2005-05-27 16:57:58 得分 6

up1002(涨不停)的理解太过简单的。  
  现在不是单用户同权限而已。  
  现在里面涉及到了角色Top

8 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-27 17:05:01 得分 0

to   madpolice()    
   
  2)我在我的电脑中属于administrator组,你在你的电脑中属于administrator组,但是你没有权限操作我的电脑,这就是“基于机构的权限控制”  
  =============================  
  这个是什么意思,能举个实际应用的例子说明一下吗?  
  在什么情况下会需要使用“基于机构的权限控制”  
   
  按照我的理解,“基于机构的权限控制”实际上只是同一个角色   Administrators对于不同对象(你的计算机或者我的计算机)的权限,实际上还是基本的基于角色的权限方案  
  没有发现什么特殊的地方呀?Top

9 楼lstup(流水)回复于 2005-05-27 17:06:18 得分 6

一般的程序,权限的控制是这样的。(非大型)  
  按模块划分各个功能区,各个区需相应的权限来控制。  
  赋予用户(管理员)相应的模块控制权限。  
   
  当到了大系统的时候可能将不适用(具体不详,没做过大项目)  
  引入了类似win的角色。(用户组)  
   
  通过3层关系可以组合出相对复杂的用户权限。  
   
  小弟还菜,懂的不多。见谅Top

10 楼phuson(寂寞沙洲)回复于 2005-05-27 17:13:37 得分 6

学习Top

11 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-27 17:14:20 得分 0

顺便再请教一个算法:  
   
  权限类型有  
          可见,  
          读取基本资料,  
          读取全部资料,  
          执行或者应用,  
          创建,  
          修改,  
          删除,  
          管理,  
          完全拥有  
   
  这几种,用的是up1002(涨不停)所说的方式,用一个ulong的几个位来表示  
  其中“管理”和“完全拥有”是独立于任何权限的  
  其他几个权限之间还有依赖关系,比如查看权限需要可见权限作为前提  
  这样就出现一个很复杂的问题:  
   
  给一个原本没有查看资料权限的角色分配查看权限许可,那需要检查该角色有没有可见权限  
  如果没有就根据一个开关来设置是否自动分配可见权限还是抛出异常  
   
  …………如果系统中只有两个权限还好,权限多了,算法极其复杂  
   
  有没有什么办法简化运算或者替代方案?Top

12 楼up1002(涨不停)回复于 2005-05-27 17:15:45 得分 6

lstup(精灵,找工作(福建)ing...)   :  
   
  角色,可以预先定义一大堆权限的组合,“按位或”,得到的权限数值作为一个角色。  
  一个用户具有多个角色,再把多个角色的权限数值“按位或”。  
   
  没有说清楚吗?  
   
  比如角色A,固有权限   1、2、4、5、6、8,   "按位或"的数值是187。  
  角色B,固有权限   1、2、3、5,   "按位或"的数值是23。  
  角色C,固有权限   2、3,"按位或"的数值是6。  
  ……  
  如果一个用户继承了角色A和C的权限,他的权限就是   191;  
  如果一个用户继承了角色B和C的权限,但因为C是包含在B中的,他的权限还是23。  
   
  可以有很多这样的角色,一个角色可以涉及的权限很多,这里不举太大的例子是为了方便口算。  
  一个用户具有多个角色就可以把多个角色的   "按位或"的数值   再次"按位或",  
  同时另外需要记录他的这个权限数值是在哪几个角色的基础上建立的。  
  在多个“角色”构建权限的基础上,还以设定用户的独立权限,  
  ——也就是   不因为某一角色而继承的权限。双重管理机制。  
  Top

13 楼lstup(流水)回复于 2005-05-27 17:20:17 得分 6

权限:  
  可见   0  
  查看   1  
  写入   2  
  修改   3  
  删除   4  
  完全   5  
  采用int可以表示权限向下支持。  
  如   5,那么所有的向下权限都知道。  
  可以判断power   >   5  
  Top

14 楼up1002(涨不停)回复于 2005-05-27 17:21:55 得分 5

eglic(圪圪)   :  
   
  给一个原本没有查看资料权限的角色分配查看权限许可,那需要检查该角色有没有可见权限  
  如果没有就根据一个开关来设置是否自动分配可见权限还是抛出异常  
  ===============================================  
   
  这里,如果用“位”来做,就不需要检查该角色是否已经拥有察看权限,  
  只要继续给他   or   一个察看权限就可以了。因为    
  0   or   1   =   1    
  1   or   1   =   1  
  Top

15 楼lstup(流水)回复于 2005-05-27 17:22:34 得分 5

up1002(涨不停)   的权限好象借鉴了   uninx的算法   1   4   7组合。  
  Top

16 楼lstup(流水)回复于 2005-05-27 17:23:40 得分 5

再次声明一下,我还菜,如果有说错的,说的不顺各朋友的意的。别见怪。^_^Top

17 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-27 17:28:32 得分 0

to   up1002(涨不停):我从左到右来表示权限序列  
   
  假设一个用户初始权限是什么都没有  
  000000000000000  
   
  现在给他一个读权限  
  010000000000000  
   
  用or运算以后就是  
  010000000000000  
  这个表示   ,没有可见权限,但是有读权限。这样是不允许的。  
  至少在我这个应用里面是不允许的Top

18 楼asd119cn(http://skyakira.cnblogs.com)回复于 2005-05-27 17:30:55 得分 5

mark  
   
  现在还是只用到单用户的权限问题。关于一下高手们的讨论吧。  
   
  Top

19 楼up1002(涨不停)回复于 2005-05-27 17:31:30 得分 5

可见(1)    
  查看   =   可见(1)+查看(2)   =   3  
  写入   =   可见(1)+写入(4)   =   5  
  修改   =   可见(1)+查看(2)+写入(4)+修改(8)   =   15  
  删除   =   可见(1)+删除(16)   =   17  
  完全   =   可见(1)+查看(2)+写入(4)+修改(8)+删除(16)   =   31  
   
  有些权限并不是完全相关的,也不是完全独立的。  
  可以定义    
   
  可见=1  
  查看=3  
  写入=5  
  修改=15  
  删除=17  
  完全=31  
   
  你不用去想“修改”权限包含了哪些,你只要把它当成15就行了。Top

20 楼lstup(流水)回复于 2005-05-27 17:31:42 得分 5

权限:  
  可见   0  
  查看   1  
  写入   2  
  修改   3  
  删除   4  
  完全   5  
  采用int可以表示权限向下支持。  
  如   5,那么所有的向下权限都知道。  
  可以判断power   >   5  
   
  可以采用从右到左。  
  那么就可以以数字进行大小对比。  
   
  走了,不说了,说了也白说-_-  
  Top

21 楼chen8967(chen8967)回复于 2005-05-27 17:35:58 得分 5

我是倒推的,不管是多复杂的身份,对某一个功能模块来说,只有能用和不能用,在这个模块里判断特定的标志位。Top

22 楼up1002(涨不停)回复于 2005-05-27 17:36:04 得分 5

也就是说,你给他“修改”权限的时候,不用考虑他是否有“可见”和“查看”等,  
  只要给他的权限   or   一个15,就有了。  
  注意,不能   +   ,一定要   or   !Top

23 楼Rwhite69()回复于 2005-05-27 17:53:38 得分 5

我也正在写这个程序,真的很头痛。我们的权限控制要做到不同部门的人员只能查询本部门的一些数据。其它部门的都没有权限。不知道各位有没有好的意见。Top

24 楼lstup(流水)回复于 2005-05-27 18:08:36 得分 5

其实很简单的事情,干嘛要复杂话呢?  
  不要想太深了  
  上午一个朋友的站被黑了,我差了半天,看了SQL语句,和参数外泄还有效验码,发现到最后原来是外部提交。把页面down到本地,直接做一个提交页面过去就是了,好饶着弯子来检查。昏迷Top

25 楼yuyijw(恋之心)回复于 2005-05-27 18:46:29 得分 5

用asp.net不就解决了吗!Top

26 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-27 20:11:46 得分 0

回复人:   yuyijw(恋之心)   (   )   信誉:100     2005-05-27   18:46:00     得分:   0      
     
     
        用asp.net不就解决了吗!  
       
     
  ===================  
  ASP.Net怎么解决?Top

27 楼lstup(流水)回复于 2005-05-27 20:38:41 得分 5

yuyijw(恋之心)    
  ================  
  net也不过是工具,这些结构思路的东西如果能用工具完成,还要程序员干什么?Top

28 楼net205(人不可以无耻到这种地步)回复于 2005-05-27 20:43:33 得分 5

俺来顶一把Top

29 楼wgf001(我心永恒)回复于 2005-05-27 20:57:48 得分 5

这确实是个麻烦问题  
  关注Top

30 楼madpolice(午夜狂龙)回复于 2005-05-28 00:10:06 得分 5

前面着急下班回家,写的比较简单。  
   
  “双重权限管理”不是所有系统都需要,但有的时候需要。  
   
  比如一套信息系统,包含集团公司的数据,集团公司下面还有分支机构,分支机构的数据也在库中。  
   
  按角色管理,分“销售”、“财务”两个角色。属于“销售”角色的人不能查询财务数据,属于“财务”角色的人不能查询销售数据。  
   
  按机构管理,分“集团”、“子公司A”、“子公司B”三个机构。属于“子公司A”的人不能查询子公司B的数据。  
   
   
  以上只是简单举例。实际上还有一些细化的规则来约束各个权限。比如权限冲突的解决,机构有隶属关系的权限的处理,等等Top

31 楼eglic(圪圪) (理由永远是谎言,信仰永远是自慰)回复于 2005-05-28 10:44:28 得分 0

回复人:   madpolice()   (   )   信誉:100    
   
  以上只是简单举例。实际上还有一些细化的规则来约束各个权限。比如权限冲突的解决,机构有隶属关系的权限的处理,等等  
   
   
  =======================  
  能具体一点说嘛?  
  Top

32 楼yjbnew(伟大的光荣的正确的ASP千岁千岁千千岁)回复于 2005-05-28 11:09:54 得分 5

这个比较繁!Top

33 楼chjpeng(鹏(招聘.net web开发程序员))回复于 2005-05-28 11:27:51 得分 5

前段时间写了一个组权限分配,可多组权限继承  
   
  实现的基本权限:  
  查看  
  增加  
  修改  
  删除  
  审核  
  取消审核  
  全部       --定义常量值为ALL  
   
  每个功能模块对应一个唯一的ID号,可对组进行权限分配,也可对个人进行权限分配  
   
  现在正在考虑针对机构分级中各个复杂规则怎么实现通用化处理  
  机构管理在每个应用中的规则可能都不相同,甚至加上机构-->区域,区域-->机构的重叠,觉得好头晕Top

34 楼poolnet()回复于 2005-05-28 11:42:46 得分 5

权限控制有两种选择:  
  1、基于资源  
  复杂系统可使用  
   
  2、基于角色  
  主要应用于简单系统Top

35 楼unknowxy(未知之数)回复于 2005-05-28 12:06:08 得分 5

角色   按树形结构来定义   如:  
                1  
        11             12  
  111   112     121   122  
   
  每个角色的访问权限是固定的(管理员分配)  
  如   角色1的访问权限是:栏目1、栏目2、栏目3  
   
  定义用户的时候把某个角色给他Top

36 楼unknowxy(未知之数)回复于 2005-05-28 12:09:17 得分 5

上面错了  
  栏目定义的时候也要对应一个角色Top

37 楼qunluo(最爱白菜)回复于 2005-05-28 13:45:27 得分 5

路过,Top

38 楼soft_2008(冬天到了,春天还远吗?)回复于 2005-05-29 03:40:32 得分 5

掺和几句:  
   
  roleAdmin(a,b,c,d,e,f)  
  roleSuperUser(b,c,d,e,f)  
  roleAgent(b,c,d,e)  
  roleUser(c,d)  
  roleBackUp(a,b,e,f)  
   
  -------------------------------  
  Admin(a,b,c,d,e,f)   HowTo   define   the   Admin   Table:  
  ----------------------------------------------------------------------  
  User                       a                   b                 c                   d                   e                     f  
  roleAdmin             1                   1                 1                   1                   1                     1  
  roleSuperUser     0                   1                 1                   1                   1                     1  
  roleAgent             0                   1                 1                   1                   1                     0  
  roleUser               0                   0                 1                   1                   0                     0  
  roleBackUp           1                   1                 0                   0                   1                     1          
  ----------------------------------------------------------------------  
  这种方法可以适用于不规则(非金字塔权限系统),也可以用双重权限系统(但用处不大)。当一个用户提交后,通过检测对应的权限值放入session变量中,在执行对应权限操作时先检测此值。Top

39 楼smile9961(good life)回复于 2005-05-29 04:35:38 得分 5

upTop

40 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2005-05-29 08:53:08 得分 5

如果用数字代表权限,硬盘文件的权限代号比较值得参考。  
  2的n次方,如果有多个权限,相加,得到的数字绝对不会重复。  
  比如:如果一个人的权限代号是33,那么肯定是2^5+2^0,具有0和5两种权限。Top

41 楼raas(朗仕)回复于 2005-05-29 08:58:22 得分 5

upTop

42 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2005-05-29 09:29:14 得分 5

核心是这几个表,如果具体做项目,还要规划权限对应的表现层。  
   
  一,人     表  
  id       姓名             组id  
  1         张三               1  
  2         李四               2  
   
  二,   组     表  
   
  id           组名                        
  1             党支部                    
  2             团支部                      
  3             小脚侦察队            
  4             特权组  
  三,权限表  
  id         权限名  
  1             扫地  
  2             看报纸  
  3             看毛片  
  4             罚款  
  四,组权对应表  
  id     组id     权id  
  1       1           1  
  2       1           2  
  3       2           2  
  4       2           3  
  5       3           3  
  6       3           4  
  7       4           1  
  8       4           2  
  9       4           3  
  10     4           4  
   
   
  规划权限对应的表现层:  
   
  根据你实际的情况,可以把权限的"颗粒度"(好多文章上都这么说)和页面,甚至函数对应起来。  
  如果用强语言做比较好,因为可以写一个复杂的核心权限类编译后到处可以调用。  
  如果用ASP就比较麻烦,因为每次要临时编译一大驮,而可能有用的只有小部分。  
  所以带复杂权限的系统,更适合ASP.NET,ASP的生存空间越来越小,好比摩托车和汽车比。  
   
  一般没有权限,那么按钮就不显示,或者进不了这个页面,  
   
  1,要么你做好多不同权限的页面,每个流程环节都指定一个模板。  
  2,要么做少数页面并且控制所有元素的隐藏显示和表现状态。  
   
  从我个人体会来讲,2不容易控制,因为权限会和流程混杂在一起,到测试的时候频繁出错。  
  所以我觉得复杂的系统,与其写复杂代码,不如把数据库设计考虑的全面细致。  
  多用几个表,多用模板,动态加载,模板要和程序分开,模板交给美工去做,反正他们也是闲着聊QQ.  
  尽量把程序员的活转嫁给美工,少用程序控制表现层。  
   
  五,权限-页面函数表  
   
  id         权限id     对应页面  
  1             1             aaa.aspx  
  2             2             bbb.aspx  
  3             3             ccc.aspx  
  4             4             ddd.aspx  
   
  其中aaa.aspx可能看起来可能只比bbb.aspx少一个按钮,但是我建议还是新开一个页面,不要做一个页面来控制按钮的显示,那样程序混乱。  
  Top

43 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2005-05-29 09:37:06 得分 5

还有页面多了一定要规划好文件夹,尤其是自定义表单,不要都放在一起,可以根据流程的名字,动态创建文件夹,好像namespace的感觉。  
  还有,表单用HTML表单比<asp:   runat="server">要节省你的工作量。  
  因为只要教会美工去做就可以了。  
   
  工作量和动态效果还有性能之间有一个平衡,没有绝对的设计方案,只有做一半才觉得不爽的设计方案。Top

44 楼chjpeng(鹏(招聘.net web开发程序员))回复于 2005-05-29 15:07:43 得分 5

学习Top

45 楼superdullwolf(超级大笨狼,每天要自强,MVP)回复于 2005-06-03 23:24:25 得分 0

最近用.net写了一个权限控制显示的树,觉得超爽,.net开发就是快!!Top

46 楼yjbnew(伟大的光荣的正确的ASP千岁千岁千千岁)回复于 2005-06-05 07:44:44 得分 0

.net能解决权限问题?

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值