本博客已经转移至www.mozlite.com,可能不会及时更新和关注留言记录,mvc请加群88794325(已满),8781765ASP.NET(MVC)讨论二群

[CommunityServer]看RBAC的一方景象

  随着时间的流逝,CommunityServer已经被我冷落了不少时间了,今天无意中又拿起了这个伟大的工程。可能CS2007的到来还有一段距离,不过也有很多人说那将要花Money去买,不管怎么样他带给了我们不少。今天我看了一下一些论坛的权限设置,所以又想起了这个咚咚;其实我对RBAC也不是非常熟悉,可能我天生对会员权限着一块就有一种恐惧感。闲话就不多说了,切入正题。

  首先对RBAC的几个概念要有所了解:RBAC的全名为
Role Based Access Control,中文名为角色访问控制。它具有两大显著的特征:1.由于角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,减小了授权管理的复杂性,降低管理开销。2.灵活地支持企业的安全策略,并对企业的变化有很大的伸缩性。

  粗粒度:表示类别级,即仅考虑对象的类别(the type of object),不考虑对象的某个特定实例。比如,用户管理中,创建、删除,对所有的用户都一视同仁,并不区分操作的具体对象实例。

  细粒度:表示实例级,即需要考虑具体对象的实例(the instance of object),当然,细粒度是在考虑粗粒度的对象类别之后才再考虑特定实例。比如,合同管理中,列表、删除,需要区分该合同实例是否为当前用户所创建。

  其他的概念可以去搜一下,网上很多,这里图个方便,写了错事抄了两个。下面我们来看看CS中是怎么来实现的:涉及到权限当然是要有用户的,在CS中用户是User类;而用户又和角色挂钩Role,用户和角色之间的关系就是UsersInRoles来关联;Role相当于Group好像其他地方都把它当成Group,在RBAC中用户是不和权限拴在一起的,每个Role都有各自的Permission;有由于CS是个集成多个ApplicationType的项目,每一个ApplicationType所对应角色的权限有可能不一样。看一下数据库的关系图:

  在cs_ProductPermissions表中存放的是各个ApplicationType所对应的一些Permission,在cs_SectionPermission表中存放的是各个Section(一些从Section继承的类)所对应的Permission。下面我们看一下CS中对Permission的定义:
 1     [Flags()]
 2     public enum Permission : long {
 3         Undefined        = 0,
 4         View            = 0x0000000000000001,
 5         Read            = 0x0000000000000002,
 6         Post            = 0x0000000000000004,
 7         Reply            = 0x0000000000000008,
 8         Edit            = 0x0000000000000010,
 9         Delete            = 0x0000000000000020,
10         LocalAttachment    = 0x0000000000000040,
11         Vote            = 0x0000000000000080,
12         MarkAsAnswer    = 0x0000000000000100,
13         RemoteAttachment= 0x0000000000000200,
14         Video            = 0x0000000000000400,
15         Ink                = 0x0000000000000800,
16         CreatePoll        = 0x0000000100000000,
17         Sticky            = 0x0000000200000000,
18         Announcement    = 0x0000000400000000,
19         EditOthers        = 0x0000000800000000,
20         Moderate        = 0x0000100000000000,
21         Administer        = 0x0100000000000000,
22         SystemAdmin        = 0x4000000000000000,
23     }
24 
25     public enum AccessControlEntry {
26         NotSet  = 0x00,
27         Allow   = 0x01,
28         Deny    = 0x02
29     }

  上面的两个枚举就是所涉及到的权限,Permissions是固定的,一个项目所涉及到的所有控制权限都应该枚举于此;AccessControlEnty枚举说明了允许和禁止的两个所对应的Permission。在这里还有一个必须要提起的一个类,那就是PermissionBase类,在各个的ApplicationType模块程序的Permission都必须继承与此类;同时在这个文件中我们还可以看到两个代理方法用于判断是否有权限。

  以我个人的理解:RBAC中User/Role/Permission=>UsersInRoles/RoleIncludePermissions/PermissionCheckFromAccess,所以在开发过程中如果需要Permission的都应PermissionCheck,有多少个Permission时固定的,这样就可以操纵Role中的Permission,从而操纵User。由于我对RBAC也不是和有研究,今天抽空来看看,如果有什么不对的地方,希望能够多多指教!
posted @ 2007-02-02 17:08  网魂小兵  Views(3231)  Comments(2Edit  收藏