SPB-可配置服务-权限

来自站长百科
跳转至: 导航、​ 搜索

导航: 上一页

SPB的权限是通过用户角色、用户级别进行设置的,一个用户可以具有多个角色,和一个用户级别,因此一个用户的权限是由用户角色及用户级别的权限合并得到的。权限合并时需要遵循以下原则:

  1. 禁止优先;
  2. 允许的权限取合集;
  3. 权限额度取最大;

一、角色

SPB的角色可以自由添加,分为两种类型:

  1. 普通角色(例如:SystemAdministrator):可以直接把用户赋予某一个或多个普通角色
  2. 虚拟角色(例如:Owner):不能把用户赋予虚拟角色,程序的默认设计或者通过在具体上下文环境中经过计算得到的角色

SPB的角色分为全局使用及个别应用使用,例如:SystemAdministrator属于全局,ClubMember仅属于圈子。

例如:

Spacebuilder099.jpg

添加新的角色时需要扩展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的附件)。

示例

Spacebuilder0100.jpg

注意

  1. ItemKey必须唯一;
  2. 启用权限设置时,权限额度才有作用,如果启用权限额度则设置权限时允许设置所允许权限的具体数值;
  3. 权限项目用于与用户角色和用户级别关联来设置相应的权限;
  • 权限项目与角色及用户级别配置

Spacebuilder0101.jpg

配置说明:

  1. 配置包括:未设置、允许、禁止 三种配置,其中未设置在以上表格中用“---”表示;
  2. 另外还有是否锁定的设置,即某项配置是否允许在后台进行修改,如果不允许管理员修改则可以设置成“锁定”;

四、如何使用权限

论坛为例,进行说明:

  • 首先分析有哪些功能,这些功能产生哪些操作。论坛包含:查看论坛主题、创建论坛主题、上传论坛附件等操作。
  • 另外分析论坛是否需要加入新的用户角色,经过分析需要加入论坛版主的角色。

Spacebuilder0102.jpg

生成加入角色的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。该权限验证类主要有两个目的:
  1. 获得用户在该上下文中的所有权限,包括虚拟角色。例如需要判定用户在某个版块是否具备版主的用户角色;
  2. 该应用独有的权限验证逻辑。例如:主题锁定则不允许回复;
  • 在Controller中调用SpaceBuilder.Forum.ForumPermission进行权限判定及验证;


参考资料[ ]