SPB-可配置服务-权限
来自站长百科
导航: 上一页
SPB的权限是通过用户角色、用户级别进行设置的,一个用户可以具有多个角色,和一个用户级别,因此一个用户的权限是由用户角色及用户级别的权限合并得到的。权限合并时需要遵循以下原则:
- 禁止优先;
- 允许的权限取合集;
- 权限额度取最大;
一、角色
SPB的角色可以自由添加,分为两种类型:
- 普通角色(例如:SystemAdministrator):可以直接把用户赋予某一个或多个普通角色
- 虚拟角色(例如:Owner):不能把用户赋予虚拟角色,程序的默认设计或者通过在具体上下文环境中经过计算得到的角色
SPB的角色分为全局使用及个别应用使用,例如:SystemAdministrator属于全局,ClubMember仅属于圈子。
例如:
添加新的角色时需要扩展SpaceBuilder.Common.UserRoleNames.
例如:
/// <summary> /// Club中用户角色扩展 /// </summary> public static class UserRoleNamesExtensions { /// <summary> /// 圈子管理员 ///</summary> public static string ClubManager(this UserRoleNames userRoleNames) { return "ClubManager"; } /// <summary> /// 圈子成员 ///</summary> public static string ClubMember(this UserRoleNames userRoleNames) { return "ClubMember"; } }
二、用户级别
类似用户组,每个用户只能属于一个用户级别。用户级别根据用户综合积分递增。
另:用户级别可以考虑增加个性展示的功能,比如使用不同的图片、颜色;
三、权限项目(PermissionItems)及配置
- 权限项目
权限项目是指在我们的应用中哪些操作需要进行权限控制,把需要进行权限控制的操作项通过编码(ItemKey)的方式存入PermissionItems。并且可以设置哪些权限项目需要在用户角色中进行配置、哪些权限项目需要在用户级别中进行配置。进行权限配置时除了可以设置是否可以进行某项操作以外,还可以设置权限额度(例如:级别1和级别2的用户都有上传附件的权限,但是级别1的用户上传附件只能上传1M的附件,而级别2的用户可以上传5M的附件)。
示例:
注意:
- ItemKey必须唯一;
- 启用权限设置时,权限额度才有作用,如果启用权限额度则设置权限时允许设置所允许权限的具体数值;
- 权限项目用于与用户角色和用户级别关联来设置相应的权限;
- 权限项目与角色及用户级别配置
配置说明:
- 配置包括:未设置、允许、禁止 三种配置,其中未设置在以上表格中用“---”表示;
- 另外还有是否锁定的设置,即某项配置是否允许在后台进行修改,如果不允许管理员修改则可以设置成“锁定”;
四、如何使用权限
以论坛为例,进行说明:
- 首先分析有哪些功能,这些功能产生哪些操作。论坛包含:查看论坛主题、创建论坛主题、上传论坛附件等操作。
- 另外分析论坛是否需要加入新的用户角色,经过分析需要加入论坛版主的角色。
生成加入角色的sql脚本.
例如:
INSERT dbo.spb_Roles (RoleID, RoleName, LoweredRoleName, FriendlyRoleName, IsBuiltIn, ConnectToUser, ApplicationID, Description, Enabled) VALUES (7, N'Moderator', N'moderator', N'版主', 1, 0, 211, N'', 1) 利用扩展方法定义SpaceBuilder.Common.UserRoleNames的扩展,注意保持Moderator()方法的返回值与上边sql脚本中的RoleName一致。 /// <summary> /// Forum中用户角色扩展 /// </summary> public static class UserRoleNamesExtensions { /// <summary> /// 论坛版主 /// </summary> public static string Moderator(this UserRoleNames userRoleNames) { return "Moderator"; } }
- 分析这些操作是否涉及到权限控制,涉及到权限控制的操作设置成权限项目并定义ItemKey,例如:ViewForumThread(查看论坛主题)、CreateForumThread(创建论坛主题)、UploadForumAttachment(上传论坛附件),一定确保ItemKey不会重复。分析哪些权限项目需要权限额度(比如允许上传图片,但是仅允许上传100M),哪些权限项目需要根据用户级别的不同而不同(即是否允许在用户级别中配置);
- 生成权限配置的初始化sql脚本.
例如:
INSERT [dbo].[spb_PermissionItems] ([ItemID], [ApplicationID], [ItemKey], [ItemName], [DisplayOrder], [EnabledPermissionLine], [EnabledInUserRole], [EnabledInUserRank]) VALUES (15, 211, N'CreateForumThread', N'发布主题', 104, 0, 1, 0) INSERT [dbo].[spb_PermissionItems] ([ItemID], [ApplicationID], [ItemKey], [ItemName], [DisplayOrder], [EnabledPermissionLine], [EnabledInUserRole], [EnabledInUserRank]) VALUES (18, 211, N'UploadForumAttachment', N'上传附件', 107, 1, 1, 1) INSERT [dbo].[spb_PermissionItemRolesInUserRoles] ([ItemID], [RoleID], [AllowType], [AllowedValue], [IsLocked]) VALUES (38, 1, 1, 0, 1) INSERT [dbo].[spb_PermissionItemRolesInUserRoles] ([ItemID], [RoleID], [AllowType], [AllowedValue], [IsLocked]) VALUES (38, 2, 1, 0, 1 )
- 定义权限验证业务逻辑类:SpaceBuilder.Forum.ForumPermission。该权限验证类主要有两个目的:
- 获得用户在该上下文中的所有权限,包括虚拟角色。例如需要判定用户在某个版块是否具备版主的用户角色;
- 该应用独有的权限验证逻辑。例如:主题锁定则不允许回复;
- 在Controller中调用SpaceBuilder.Forum.ForumPermission进行权限判定及验证;