淘宝店地址:http://jirigala.taobao.com QQ:2520 56973 MSN:Jirigala_bao@hotmail.com
Spiga

简单操作权限就一个函数足够了,甚至5-6个表足够可以了,没必要搞那么复杂,也没必要瞎搞误人子弟啊

2009-06-15 13:07 by 通用权限管理系统组件, 4765 visits, 收藏, 编辑

有句俗话叫“折腾来折腾去,又折腾回原点了”,这就对了,就应该是回到最原点才是硬道理。

1.用户表(有哪几个用户)
2.角色表(有哪几个角色)
3.用户角色关联表(那些用户属于那些角色)
4.权限表(有哪几个权限需要分配)
5.权限存储表(用户有哪些权限,角色有哪些权限,可以分开也可以和在一起)

就一个判断权限函数 例如 
CheckPermission(String userID, String permissionCode)
IsAuthorization(String userID, String permissionCode) 
基本上可以满足要求了。

通常的需求分析
1. 各个页面上的按就的操作,列的操作等。
CheckPermission(userID, “PageA.BtnAdd”) 有没有对添加按钮有操作权限?例如添加权限。
CheckPermission(userID, “PageA.BtnDelete”) 有没有对添加按钮有操作权限?例如添加权限。
CheckPermission(userID, “PageA.TableB.ColumnC”) 有没有列C的查看权限。
2. 对数据表,字段的访问权限控制等
CheckPermission(userID, “TableA”) 有没有访问这个表的权限。
CheckPermission(userID, “TableA.Access”)
CheckPermission(userID, “TableA.Delete”)
CheckPermission(userID, “TableA.ColumnB”) 对列的访问权限。
CheckPermission(userID, “TableA.ColumnB.Access”) 对列的访问权限。
CheckPermission(userID, “TableA.ColumnB.Delete”) 对列的访问权限。
。。。。。。 你想怎么来就怎么来吧,想怎么想象就怎么想象,好用简单是硬道理。

 

或者你封装一下这个函数
CheckColumnPermission(String userID, String table, String column)
{
    return CheckPermission(userID, “table.column.Access”)
}

 

说白了,permissionCode 里你想写啥都可以,都可以判断,只是你合理的规划命名方式就可以了,
没必要搞太负责太折腾,真的一个简单的道理,可以做出非常复杂的东西来,不要把简单问题复杂化了,
吧复杂问题简单化才是硬道理,暂不讨论数据集权限问题,就是对数据的过滤权限,那以超出本贴的讨
论范围。

很早很早的时候,我看过 0,1什么代表的权限,那真的不太好用,除非权限很少。
也在很早的时候,看过 1代表啥权限,2代表啥权限,4代表啥权限,8又代表啥权限,
1+2+4+8 等来表示,有那些权限等,当时觉得很神奇,现在想想都是瞎扯蛋。

就因为我天天研究权限啊啥的,与时代落伍了,这玩意儿是有需要,但是没啥大用,
还是以业务为核心,还是以网络应用为核心,搞搞电子商务是硬道理,要赚网络的钱
才是硬道理,时代已经变了,有一个朋友说,醒醒吧,现在是电子商务时代了,说得对啊,我听进去了。

 

将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。
Add your comment

82 条回复

  1. #1楼 入门级[未注册用户]2009-06-15 13:10
    同一个页面,同意该按钮
    相同的查询条件
    我就要出来不同的数据

    在哪?
    纯探讨,不是捣乱滴
     回复 引用   
  2. #2楼 reokok[未注册用户]2009-06-15 13:10
    正是真么做的,感觉挺好
    适合就好
     回复 引用   
  3. #3楼[楼主] 吉日嘎拉      2009-06-15 13:11
    回复1楼,明确在贴中提出
    “暂不讨论数据集权限问题,就是对数据的过滤权限,那以超出本贴的讨
    论范围”。

    接下来会有专门的贴提出这个问题,因为那个相对复杂一些,能得到大家
    的认可,不容易,会很尖锐。
     回复 引用 查看   
  4. #4楼 入门级[未注册用户]2009-06-15 13:14
    sorry
    没注意那行字

    建议把那行字放到前面去

    不过还是有些疑惑啊,
    这样是不是数据级别的东西太多了啊

    如果我抽象出来对象了,这些字段什么的概念是不是也的跟着走呢
     回复 引用   
  5. #5楼[楼主] 吉日嘎拉      2009-06-15 13:16
    多怕啥? 你权限分的就多? 就应该是多。
     回复 引用 查看   
  6. #6楼 xiao_p(未登录)[未注册用户]2009-06-15 13:22
    很早很早的时候,我看过 0,1什么代表的权限,那真的不太好用,除非权限很少。
    >>>
    为什么不好用?
     回复 引用   
  7. #7楼 个人知识管理      2009-06-15 13:27
    高并发还是需要缓存技术的(WCF)
     回复 引用 查看   
  8. #8楼 金色海洋(jyk)      2009-06-15 13:28
    听说你在回复里面说,你尊重我。我很感谢,只是我觉得我的解释(关于技术、权限方面的),你是一句都没有听进去,所以我也就不想再做什么解释了。另外我不喜欢辩论,更不喜欢争论。

    望见谅。

    这个不会被你给删除了吧。
     回复 引用 查看   
  9. #9楼[楼主] 吉日嘎拉      2009-06-15 13:31
    其实,谁没听进去的谁的,还是2回事情啊。
    我建议你,命名要规范,设计要严谨,要符合数据库范式,别啥都放数据库,
    不知道你是否听进去了?我觉得这些也是很基本的东西啊,
    你给我发的评论,几乎都没删除过的,别人乱骂的,我会删除的。
    你的好像我很少删除的,但是你把我的都删除了,这是实话。

    我只删除那些肤浅的、乱骂人的帖子,说得有道理的,都保留的。
    我鄙视那些匿名骂人的家伙,都不敢站出来PK,不值得成为我的对手。
    我只看做那些人为卑鄙小人。

     回复 引用 查看   
  10. #10楼[楼主] 吉日嘎拉      2009-06-15 13:32
    不管对错,我都敢站出来,说出来,真名真姓PK, 我能说出来我的想法。
    非常鄙视匿名小人。
     回复 引用 查看   
  11. #11楼[楼主] 吉日嘎拉      2009-06-15 13:33
    思想比代码重要, 看懂思想需要更高的境界,看懂代码,入门写程序的都可以。
     回复 引用 查看   
  12. #12楼 罗里罗嗦夫斯基      2009-06-15 13:42
    我很感兴趣你的这个CheckPermission是如何实现的。
     回复 引用 查看   
  13. #13楼 kiler      2009-06-15 13:42
    --引用--------------------------------------------------
    入门级: 同一个页面,同意该按钮
    相同的查询条件
    我就要出来不同的数据

    在哪?
    纯探讨,不是捣乱滴
    --------------------------------------------------------
    首先,你说的权限与按钮和页面是无关的。
    实现你说的权限就是把权限在细分一下,分成资源和操作
    如:
    权限a = 所有产品 + 查看
    权限b = 家电类产品 + 查看
    权限b = 食品类产品 + 查看
    资源甚至可以定义为一个带参数的查询语句,这样你的问题就彻底解决了。
     回复 引用 查看   
  14. #14楼 kiler      2009-06-15 13:44
    --引用--------------------------------------------------
    xiao_p(未登录): 很早很早的时候,我看过 0,1什么代表的权限,那真的不太好用,除非权限很少。
    >>>
    为什么不好用?
    --------------------------------------------------------
    这种权限不能动态配置,加一个减一个立马死翘翘。
     回复 引用 查看   
  15. #15楼 bensoft[未注册用户]2009-06-15 13:49
    对于页面中某个按钮谁可以点击或者某个Create页面谁可以访问,这类权限的判断都比较好实现;我个人把这类权限称为“系统级”(或者硬编码的权限标识,在 系统设计时就确定下来的权限项);

    但是,对于“什么人对满足什么样条件的数据集具有什么样的操作权限”(我称之为“数据级”),比如:对于开发一部的项目经理级别的人员可以浏览属于该部门的所有项目的所有信息。对于这样的权限判断你的模型是如何考虑的?
     回复 引用   
  16. #16楼 一舟      2009-06-15 13:54

    15樓@bensoft的問題真好,以前碰到這種基本上都硬編碼。學到老活到老。
     回复 引用 查看   
  17. #17楼 kiler      2009-06-15 13:54
    --引用--------------------------------------------------
    bensoft: 对于页面中某个按钮谁可以点击或者某个Create页面谁可以访问,这类权限的判断都比较好实现;我个人把这类权限称为“系统级”(或者硬编码的权限标识,在 系统设计时就确定下来的权限项);

    但是,对于“什么人对满足什么样条件的数据集具有什么样的操作权限”(我称之为“数据级”),比如:对于开发一部的项目经理级别的人员可以浏览属于该部门的所有项目的所有信息。对于这样的权限判断你的模型是如何考虑的?
    --------------------------------------------------------
    权限拆分为资源与操作
    资源 (@DepartmentID部门下面的所有项目)
    操作 增删改查
    @DepartmentID是一个参数,运行时赋值。
    这样就可以解决你的问题了。
     回复 引用 查看   
  18. #18楼 bensoft[未注册用户]2009-06-15 13:55
    --引用--------------------------------------------------
    首先,你说的权限与按钮和页面是无关的。
    实现你说的权限就是把权限在细分一下,分成资源和操作
    如:
    权限a = 所有产品 + 查看
    权限b = 家电类产品 + 查看
    权限b = 食品类产品 + 查看
    资源甚至可以定义为一个带参数的查询语句,这样你的问题就彻底解决了。
    --------------------------------------------------------

    你的方案基本上可以解决我刚才提出的问题。
    但是还可以进一步抽象一下。再考虑下权限分配的UI的实现?权限策略的存储方式?
     回复 引用   
  19. #19楼 一舟      2009-06-15 13:58
    @kiler的做法蠻不錯!下次試試。
     回复 引用 查看   
  20. #20楼 麒麟.NET      2009-06-15 13:59
    这样进行权限操作,CheckPermission方法估计不下2000行,每个小的操作都要switch case......
     回复 引用 查看   
  21. #21楼 一舟      2009-06-15 14:03
    @kiler,你的实现方法,会让权限变成了与业务强耦合,这样每一个系统都需要把需要管控的权限进行配置和编码。
     回复 引用 查看   
  22. #22楼 玉开      2009-06-15 14:03
    两年前写的一篇关于权限的文章,感觉还是没有过时,接贵宝地再推广一下

    http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html
     回复 引用 查看   
  23. #23楼 kiler      2009-06-15 14:03
    @bensoft
    UI也是一种资源啊,和所有产品是一样的
    资源 权限
    A页面B按钮 + 可操作
    UI资源储存和数据资源储存需要的字段是不一样的,可以考虑使用表继承模式来实现存储。
    我的权限系统里面有如下表
    SystemOperation 操作表
    SystemResources 资源表
    SystemPrivilege 权限表
    SystemPrivilegeInRoles 权限分配表
    SystemPrivilege 是由一个 资源 和 操作 组成的。
    最近在公司的架构里刚实现到lz的那个程度,等下次深入实现了,写篇文章和大家讨论一下。
     回复 引用 查看   
  24. #24楼 麒麟.NET      2009-06-15 14:06
    --引用--------------------------------------------------
    玉开: 两年前写的一篇关于权限的文章,感觉还是没有过时,接贵宝地再推广一下

    <a href="http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html" target="_new">http://www.cnblogs.com/yukaizhao/archive/2007/04/15/user_role_action_permission.html</a>
    --------------------------------------------------------
    图片都显示不了了……
     回复 引用 查看   
  25. #25楼 kiler      2009-06-15 14:08
    @一舟
    没办法,权限本来就是和业务相关的,是会造成一些代码变多的情况,我的解决方案就是利用代码生成工具和数据库自动生成程序来缓解一下配置的压力。
     回复 引用 查看   
  26. #26楼 一舟      2009-06-15 14:14
    --引用--------------------------------------------------
    kiler: @一舟
    没办法,权限本来就是和业务相关的,是会造成一些代码变多的情况,我的解决方案就是利用代码生成工具和数据库自动生成程序来缓解一下配置的压力。
    --------------------------------------------------------
    院子里曾有位高人曾说过,可以用代码生成工具的地方都可以抽象出来。害得俺一直在思考这个问题。
     回复 引用 查看   
  27. #27楼 终极马甲[未注册用户]2009-06-15 14:16
    简单操作权限就一个函数足够了,甚至1个表足够可以了,没必要搞那么复杂,也没必要瞎搞误人子弟啊
     回复 引用   
  28. #28楼 一舟      2009-06-15 14:18
    @终极马甲
    大 道 至 简 !高!!!!!!!!!!!!!
     回复 引用 查看   
  29. #29楼 终极马甲[未注册用户]2009-06-15 14:20
    --引用--------------------------------------------------
    一舟: @终极马甲
    大 道 至 简 !高!!!!!!!!!!!!!
    --------------------------------------------------------


    ^_^ 跟别人学学,也装装B,反正不用拿什么实际东西出来 。
     回复 引用   
  30. #30楼 kiler      2009-06-15 14:22
    @一舟
    不是这样的,我举个例子
    CheckPermission(userID, “PageA.BtnAdd”)
    CheckPermission(userID, “PageA.BtnDelete”)
    CheckPermission(userID, “PageA.TableB.ColumnC”)
    “PageA.BtnAdd”,“PageA.BtnDelete”,“PageA.TableB.ColumnC”这些权限名都是硬编码的,老大发话了,硬编码不行,要改成常量,我写一个程序直接读取数据库里面的所有权限名,生成一个PermissionNameList类,ok,我的问题全解决了,也不怕我的程序员写错权限名了
    向下面这个类一样
    public static class PermissinNameList
    {
    /// <summary>
    /// EmployeesAdd
    /// </summary>
    public const string PERMISSION_NAME_EMPLOYEESPERMISSION_EMPLOYEESADD = "EmployeesAdd";
    /// <summary>
    /// EmployeesEdit
    /// </summary>
    public const string PERMISSION_NAME_EMPLOYEESPERMISSION_EMPLOYEESEDIT = "EmployeesEdit";
    /// <summary>
    /// EmployeesView
    /// </summary>
    public const string PERMISSION_NAME_EMPLOYEESPERMISSION_EMPLOYEESVIEW = "EmployeesView";
    /// <summary>
    /// EmployeesDelete
    /// </summary>
    public const string PERMISSION_NAME_EMPLOYEESPERMISSION_EMPLOYEESDELETE = "EmployeesDelete";
    }
    下次权限改了,重新生成一次,很省事的,这样的要求至少现在C# 3.0做不出来。
     回复 引用 查看   
  31. #31楼 一舟      2009-06-15 14:24
    @终极马甲
    看人家@kiler很务实。基本上帮楼主做答了。嘿。BS你一下。
     回复 引用 查看   
  32. #32楼[楼主] 吉日嘎拉      2009-06-15 14:26
    回复20楼,不超过200行。夸张的说,可能100行就够了,还谦虚的态度讲了200行。
     回复 引用 查看   
  33. #33楼[楼主] 吉日嘎拉      2009-06-15 14:27
    回复 #22楼,玉开写的权限设计,是对的,我刚扫了一眼,跟我的是一致的。

     回复 引用 查看   
  34. #34楼 温景良(Jason)      2009-06-15 14:31
    俺也是那么做的
     回复 引用 查看   
  35. #35楼 一舟      2009-06-15 14:32
    @kiler
    呵呵,这种编码也挺好,有VB的风格。

    俺总结一下,权限分两种,一种是不变的,与业务无关,可以到处使用,比如添加删除修改。
    一个是可变的,与业务有关,单独配置和编码。至于怎么编码都所谓了,怎么简单怎么来。
     回复 引用 查看   
  36. #36楼 o my g0d[未注册用户]2009-06-15 14:41
    8=1 0 0 0
    表示具有拥有权限A,而不具备权限BCD
    这么好用,还不懂

    我靠
     回复 引用   
  37. #37楼 kiler      2009-06-15 14:43
    --引用--------------------------------------------------
    o my g0d: 8=1 0 0 0
    表示具有拥有权限A,而不具备权限BCD
    这么好用,还不懂

    我靠
    --------------------------------------------------------
    用户要求删除B权限加上I,J,L,G,F,D,你怎么办?
    所有的权限code重新更新一遍?怎么更新?
     回复 引用 查看   
  38. #38楼 玉开      2009-06-15 14:44
    @麒麟.NET
    都可以显示的,你再试下
     回复 引用 查看   
  39. #39楼 Alvin      2009-06-15 14:48
    对列的访问权限?很多现实中应该是对行的。楼主是不是在误导别人?
     回复 引用 查看   
  40. #40楼 o my g0d[未注册用户]2009-06-15 14:49
    @kiler
    直接进行二进制位运算不就行了啊!

    这还不简单



     回复 引用   
  41. #41楼 麒麟.NET      2009-06-15 14:49
    --引用--------------------------------------------------
    吉日嘎拉: 回复20楼,不超过200行。夸张的说,可能100行就够了,还谦虚的态度讲了200行。
    --------------------------------------------------------
    是的,我一开始理解错了,CheckPermission很简单,只是看看表里有没有相应的记录,返回true/false就可以了。
     回复 引用 查看   
  42. #42楼 o my g0d[未注册用户]2009-06-15 14:52
    二进制在权限验证中的应用(转)
    http://www.cnblogs.com/yinhaiming/articles/1386888.html
     回复 引用   
  43. #43楼 kiler      2009-06-15 14:56
    @o my g0d
    权限code变了
    以前1 0 0 0
    表示具有拥有权限A,而不具备权限BCD
    如果要求删除 A权限加上 F,G权限的话
    权限code就是5位的
    10000表示具有拥有权限B,而不具备权限CDFG

    你说的东西只能处理文件这种操作定死了的东西的权限,复杂的东西根本就处理不了。
     回复 引用 查看   
  44. #44楼 沉默的糕点      2009-06-15 14:58
    --引用--------------------------------------------------
    o my g0d: 二进制在权限验证中的应用(转)
    <a href="http://www.cnblogs.com/yinhaiming/articles/1386888.html" target="_new" rel="nofollow">http://www.cnblogs.com/yinhaiming/articles/1386888.html</a>
    --------------------------------------------------------
    二进制的方式,这个才是正途。

    1 读
    3 改 2+1(读),
    5 删除 4 +1(读)。
    很好啊。为什么是扯谈了?
     回复 引用 查看   
  45. #45楼 不能飚车      2009-06-15 14:59
    支持lz,和我的想法一样,几年前做OA时实际就是这么做的。
     回复 引用 查看   
  46. #46楼 kiler      2009-06-15 15:08
    所谓二进制的方式只是查询效率高点,对于解决权限管理问题的复杂性没有任何帮助,只能适用于权限定死的系统。
     回复 引用 查看   
  47. #47楼 王一一2009-06-15 15:14
    楼主说的确实不错,虽没技术含量。却能使人开阔视野。我顶,希望楼主多写点开阔视野的文章。
     回复 引用   
  48. #48楼 love24      2009-06-15 15:34
    只有5.6个表.真是不复杂...
     回复 引用 查看   
  49. #49楼 taia      2009-06-15 15:42
    请教LZ两个问题:
    1。这样的验证方法,如何与商业逻辑分离呢
    2。如果我有一个文章系统,A用户管理新闻分类ID为2,3的新闻,B用户管理分类ID为3,4的新闻,这种如何设计permissionCode呢?
     回复 引用 查看   
  50. #50楼 zitsing      2009-06-15 15:43
    也许很好吧,有例子就好了.
     回复 引用 查看   
  51. #51楼[楼主] 吉日嘎拉      2009-06-15 15:46
    回复 #49楼,你可以参考一下,不合理之处请批评。
    CheckPermission(userID, “新闻.2”)
    CheckPermission(userID, “新闻.3”)
    CheckPermission(userID, “新闻.4”)
    就这么简单,完事儿。
     回复 引用 查看   
  52. #52楼[楼主] 吉日嘎拉      2009-06-15 15:48
    回复 #49楼,权限的函数跟任何一个商业逻辑无关,这就是纯粹的权限,
    然后你的商业逻辑里在进行组合调用等,可以直接调用这些函数,也可以
    按你的商业规则,制作出你想要的函数。

    操作系统和数据库,也不是完全能分开的,
    权限和商业逻辑,也不是完成分开的,只是紧密程度越低,越容易维护。

     回复 引用 查看   
  53. #53楼 一舟      2009-06-15 15:55
    --引用--------------------------------------------------
    吉日嘎拉: 回复 #49楼,你可以参考一下,不合理之处请批评。
    CheckPermission(userID, “新闻.2”)
    CheckPermission(userID, “新闻.3”)
    CheckPermission(userID, “新闻.4”)
    就这么简单,完事儿。

    --------------------------------------------------------
    你这个也太敷衍了。
    “新闻.2,新闻.3”是动态生成的,总不至于先把所有的分类都设置好了,然后再到代码里进行CheckPermission。

     回复 引用 查看   
  54. #54楼 taia      2009-06-15 15:58
    我这样理解看对不,把新闻分类表首选分成S,U,I,D(增删改查)四种,然后如果遇到细到ID的权限的话,还得在后面加上ID号,这样有10个新闻分类的话,那么这样的权限记录就在要“权限表”里插入4*10=40条记录,如果还有更细的权限,是不是还得乘上相应的系数?如果一个比较大的系统,那这里的“权限表”会不会很大,成为效率瓶颈?
     回复 引用 查看   
  55. #55楼 hrmai[未注册用户]2009-06-15 16:03
    先问一下楼主工作流和权限管理你是做成一个系统的还是分开的了?可以给一个具体的思路不?最近在做这方面的东西,无从下手。。。
     回复 引用   
  56. #56楼[楼主] 吉日嘎拉      2009-06-15 16:03
    回复,#54楼 ,啥叫数据库?数据库的优点是啥?
    就算有10万条权限数据,又能怎么样?我的个人老笔记本上跑跑都速度很快的,
    更何况拿到服务器上跑,这点儿数据算啥。

    若是1000万条权限数据,我还真不敢这么说了,您说呢?



     回复 引用 查看   
  57. #57楼[楼主] 吉日嘎拉      2009-06-15 16:05
    回复 #55楼,权限是权限,这个是单独的,跟其他没有多大关系,
    工作流是工作流,但是工作流里会用到权限,当一个权限组件用的。
     回复 引用 查看   
  58. #58楼 taia      2009-06-15 16:28
    --引用--------------------------------------------------
    吉日嘎拉: 回复,#54楼 ,啥叫数据库?数据库的优点是啥?
    就算有10万条权限数据,又能怎么样?我的个人老笔记本上跑跑都速度很快的,
    更何况拿到服务器上跑,这点儿数据算啥。

    若是1000万条权限数据,我还真不敢这么说了,您说呢?
    --------------------------------------------------------

    呵呵,这么评价效率有点主观了(效率==速度??)
    如果读一下只有10个记录的表,却还得查一下10万条记录的权限表,这是什么样的效率(可能在你的笔记本上速度如飞)
     回复 引用 查看   
  59. #59楼 飘过[未注册用户]2009-06-15 16:50
    也在很早的时候,看过 1代表啥权限,2代表啥权限,4代表啥权限,8又代表啥权限,
    1+2+4+8 等来表示,有那些权限等,当时觉得很神奇,现在想想都是瞎扯蛋。

    ————————
    你没写过C程序吧 不知道有“位运算”吧 比你的字符串比较快N倍
     回复 引用   
  60. #60楼 小猴子      2009-06-15 16:55
    不错,也支持下。
    当年为了实现行级数据权限没少费劲
     回复 引用 查看   
  61. #61楼 bensoft[未注册用户]2009-06-15 17:20
    --引用--------------------------------------------------
    吉日嘎拉: 回复,#54楼 ,啥叫数据库?数据库的优点是啥?
    就算有10万条权限数据,又能怎么样?我的个人老笔记本上跑跑都速度很快的,
    更何况拿到服务器上跑,这点儿数据算啥。

    若是1000万条权限数据,我还真不敢这么说了,您说呢?

    --------------------------------------------------------

    您这样解释有点强词夺理,问题的关键不是笔记本和服务器之间的差距的问题。
    权限判断是非常频繁的,如果需要控制的资源是根据一定的条件从大量的数据中经过复杂查询得到的(就像我上面例子中提到的,而且这种情况也是比较普遍的),那么,性能也是必须要考虑的。如果按照您的逻辑,再烂的程序都可以通过硬件设备的大量投资来解决性能,而这是不现实的。

    我只是想说,如果针对小型项目或这特定项目,您的观点我非常赞同,适用/实用至上,像您说的“一个函数”足以,我赞同。
    但是,如果谈到“权限模型”,好的开放权限模型需要考虑很多问题,就像你的“一个函数”,那这个函数内部怎么实现呢?刚才说的缓存问题,要不要考虑?权限策略变化时缓存如何更新?基于角色的权限继承和否决?需要控制的对象(或者资源)之间的依赖关系(最典型是上下级)如何处理?还有我之前也提到的权限授权的UI页面该怎么实现?是否每次新增模块(或者新项目)都要单独设计一个针对该业务模块的资源授权界面?等等。
     回复 引用   
  62. #62楼 私家侦探      2009-06-15 17:21
    是啊,不要太复杂,客户看不懂,折腾
     回复 引用 查看   
  63. #63楼 bensoft[未注册用户]2009-06-15 17:24
    --引用--------------------------------------------------
    飘过: 也在很早的时候,看过 1代表啥权限,2代表啥权限,4代表啥权限,8又代表啥权限,
    1+2+4+8 等来表示,有那些权限等,当时觉得很神奇,现在想想都是瞎扯蛋。

    ————————
    你没写过C程序吧 不知道有“位运算”吧 比你的字符串比较快N倍

    --------------------------------------------------------

    在权限项有限并且比较固定的时候用这种方式是首选。
    但是楼主讨论的业务权限项相对复杂的时候,采用规范明明的KEY个人认为更为合适,在开发过程中也便于识别和维护。在这种情形下,所谓的位运算和字符串比较之间的速度不是关键,更不是瓶颈。

     回复 引用   
  64. #64楼 profit[未注册用户]2009-06-15 17:35
    期待楼主的数据过滤权限
     回复 引用   
  65. #65楼 bensoft[未注册用户]2009-06-15 17:43
    @吉日嘎拉:

    ====================
    我们在您的权限模型的基础上,来讨论我这样的一个情形,

    项目分类表
    ---------------------------
    PrjTypeID ,项目类型编号
    PrjTypeName , 项目类型名称

    项目表
    ---------------------------
    PrjID,项目编号
    PrjTypeID,项目类型
    PrjManager,项目经理的用户编号
    Department,项目所属部门(复杂一点的一个项目可能属于多个部门)
    PrjName , 项目名称
    ....


    就像我刚才说到的那种情形 :
    “开发一部的项目经理级别的人员可以浏览属于该部门的所有项目的所有信息”
    在您的权限系统中,权限策略怎么描述?权限判断怎么实现啊?

    我很想知道您是怎么实现的,能否讨论下?


     回复 引用   
  66. #66楼 中尉      2009-06-15 17:45
    --引用--------------------------------------------------
    kiler: @一舟
    没办法,权限本来就是和业务相关的,是会造成一些代码变多的情况,我的解决方案就是利用代码生成工具和数据库自动生成程序来缓解一下配置的压力。
    --------------------------------------------------------
    阁下的思想很好的.我们似乎02年左右就操作这个了.
     回复 引用 查看   
  67. #67楼 不若相忘于江湖      2009-06-15 18:13


    看了你的文章不知该说什么。。

    看了等于白看。。。。。
     回复 引用 查看   
  68. #68楼 gd[未注册用户]2009-06-15 18:20
    项目权限、流程权限看你怎么控制。还是不同组织的权限
     回复 引用   
  69. #69楼 Steven Chen      2009-06-15 21:03
    我们的国情就这样子,一个非常简单的业务系统(可能就三种单据),但是组织结构和功能权限非常复杂,老外一般比较喜欢用活动目录,没有权限系统这个说法。

    看设么样子的业务,一般我不会设计那么复杂的权限系统,够用就好。
    兄弟我说一下你的设计,如果说得有些不妥,你多多评论:
    4.权限表(有哪几个权限需要分配)这个表的功能有些"强大",可以考虑拆分成两个表,一个是资源表(比如说每一篇文章,或者是每个页面,或者是一个单句的一项数据,反正粒度多大自己控制,粒度小的化这块可以变成多个表,每个资源都有一个URL--Guid也OK),然后是一个操作表(每种资源对应的可操作,比如说读取,更新,删除,隐藏......(做过政府项目就知道了这个有多么的多了))。
    5.权限存储表,这个修改成角色与资源,操作对应表。

    然后就OK了,考虑好操作中有一些操作是相互重叠的,比如说更新权限必然有读取的权限,更新权限也可以由增加和删除权限来模拟完成.........就是说它们是一堆带有位标志的enum------这个地方就用到了你说得"1+2+4+8",这种方式仅仅是操作重叠的一种实现,至于你用什么方式来实现,无所谓了,但是"1+2+4+8"这的确是一个很好的方式。


    权限系统如何验证,那完全是设计的事情,事物脚本可能就是你说的那个样子调用了,领域模型可能是对象被操作的时候直接检查角色,角色不对就抛出特定Exception。


    至于设计一个复杂的权限系统,恩,应该算是中国国情下培养出来的程序员吧。
     回复 引用 查看   
  70. #70楼[楼主] 吉日嘎拉      2009-06-15 22:19
    回复 #69楼,的确我们国人的脑子过于复杂,反而把问题搞得过度复杂,
    我先不乱点评你的留言,我仔细研究后,慢慢交流,因为乱点评也是属于
    不尊重别人,过于肤浅,先我给我点儿时间,空了再PK。
     回复 引用 查看   
  71. #71楼 打酱油的[未注册用户]2009-06-15 22:26
    经验告诉我们,永远不要管理单独的用户,建立用户组,然后管理它们。
     回复 引用   
  72. #72楼 海妖的夜[未注册用户]2009-06-15 23:14
    我没做过权限方面的事情,但想想不过是这般思路罢了:
    1. 把用户分组, 权限全部分配到组上
    2. 把资源映射到权限, 比如按钮的权限, 数据库表列的CRUD权限
    3. 分析每次动作的资源组, 如访问某个系统某个页面的某个按钮
    4. 权限流, 如先判断某个组是否A权限, 然后是否B权限, 是否C权限, 类似二进制,但不用数字表示

    博主的做法是把资源全部拼在一起了, 这样扩展起来麻烦, 不如参考以上说法, 做成权限流.

    以上一家之言, 期望博主拍砖.
     回复 引用   
  73. #73楼 Steven Chen      2009-06-15 23:32
    --引用--------------------------------------------------
    吉日嘎拉: 回复 #69楼,的确我们国人的脑子过于复杂,反而把问题搞得过度复杂,
    我先不乱点评你的留言,我仔细研究后,慢慢交流,因为乱点评也是属于
    不尊重别人,过于肤浅,先我给我点儿时间,空了再PK。

    --------------------------------------------------------
    玉开的那篇,几乎已经把所有的情况都考虑了,剩下的,无非就是怎么实现了。

     回复 引用 查看   
  74. #74楼 在别处      2009-06-16 07:44
    windows的权限是如何实现的,像楼主这样吗?
     回复 引用 查看   
  75. #75楼 chenkai      2009-06-16 09:19
    今天过来喝八宝粥 评论也真够乱的!
    其实这个权限总是有人想把它做成通用的,拼我个人感受而言 ,如果用通用二字来做,必定使会走入一个死循环一样. 所谓权限就应该做的实用一些,以当前的业务逻辑为核心,不一定最复杂就是最好的,看到圈子里一片有一篇这样的文章出现 但还是感觉收获不大...
     回复 引用 查看   
  76. #76楼 guest[未注册用户]2009-06-16 09:23
    楼主说的有道理
     回复 引用   
  77. #77楼 ddd[未注册用户]2009-06-16 10:03
    楼主的方案是简单实用派的,大部分项目都适用
    其他更复杂的方案,可能只适用于极少一部分特例

    希望看到楼主的工作流相关的经验分享
     回复 引用   
  78. #78楼 huankfy      2009-06-16 10:06
    你这个还是基于RBAC的思想在做权限设计,acl在很早很早以前很适用,后来才延伸到了rbac,06年的时候看了更新的权限思想,只是当时没看懂
    你这个还是局限在了rbac的框架中
     回复 引用 查看   
  79. #79楼 DAP      2009-06-16 11:07
    楼主要是能给俺个关于权限的例子就好了。如果楼主有的话还请赐教丫……

    先行谢过!
     回复 引用 查看   
  80. #80楼 Artech      2009-06-16 12:02
    有没有想过一个问题,并不是所有的授权都是基于角色的。很多场景都需要结合Role, Identity, Orgnization等等进行授权!

    我觉得采用基于表达式,即将授权的规则通过表达式来定义是一个不错的选择,不过很难维护!
     回复 引用 查看   
  81. #81楼 ddd[未注册用户]2009-06-16 12:04
    --引用--------------------------------------------------
    huankfy: 你这个还是基于RBAC的思想在做权限设计,acl在很早很早以前很适用,后来才延伸到了rbac,06年的时候看了更新的权限思想,只是当时没看懂
    你这个还是局限在了rbac的框架中
    --------------------------------------------------------
    角色访问控制不好么?实用就行
     回复 引用   
  82. #82楼 左右期限      2010-06-14 11:53
    对所有楼上的模板,小弟完全没理解,菜鸟。。。
     回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1503552 E/qmnu4YUXQ=


C# ASP.NET 通用权限设计、通用权限管理、通用权限组件、单点登录、集中式权限管理、统一授权体系、分级管理分级授权