首先对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 }
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也不是和有研究,今天抽空来看看,如果有什么不对的地方,希望能够多多指教!