项目

权限管理模块

本模块通过实现 IPermissionStore 接口,将权限值存储并管理在数据库中。

本文档仅介绍将权限值持久化到数据库的权限管理模块。如需了解授权与权限系统的工作原理,请参阅 授权文档

安装方法

此模块已预装为 NuGet/NPM 包。您可继续以包形式使用并轻松获取更新,也可将其源代码集成至您的解决方案(使用 get-source CLI 命令)以开发自定义模块。

获取源代码

该模块的源代码可在此处访问:源码仓库。源代码基于 MIT 协议授权,可自由使用与定制。

用户界面

权限管理对话框

权限管理模块提供了可复用的对话框,用于管理对象关联的权限。例如,身份认证模块 使用此对话框管理用户与角色的权限。下图展示了身份认证模块的角色管理页面:

权限模块-打开对话框

点击角色对应的 操作 -> 权限 时,将打开权限管理对话框。该对话框的示意截图如下:

权限模块-对话框

在此对话框中,可为选定角色授予权限。左侧标签页代表主权限分组,右侧区域显示选定分组内定义的权限项。

IPermissionManager 服务

IPermissionManager 是本模块提供的核心服务,用于读取和修改权限值。该服务通常被 权限管理对话框 调用,您也可在需要设置权限值时直接注入使用。

若仅需读取/检查当前用户的权限值,请使用 IAuthorizationService[Authorize] 特性,具体方法参见 授权文档

示例:通过 IPermissionManager 服务为用户和角色授予权限

public class MyService : ITransientDependency
{
    private readonly IPermissionManager _permissionManager;

    public MyService(IPermissionManager permissionManager)
    {
        _permissionManager = permissionManager;
    }

    public async Task GrantRolePermissionDemoAsync(
        string roleName, string permission)
    {
        await _permissionManager
            .SetForRoleAsync(roleName, permission, true);
    }

    public async Task GrantUserPermissionDemoAsync(
        Guid userId, string roleName, string permission)
    {
        await _permissionManager
            .SetForUserAsync(userId, permission, true);
    }
}

权限管理提供程序

权限管理模块与 权限系统 一样支持扩展。您可以通过定义权限管理提供程序来扩展其功能。

身份认证模块 内置了以下提供程序:

  • UserPermissionManagementProvider:管理基于用户的权限
  • RolePermissionManagementProvider:管理基于角色的权限

IPermissionManager 在获取/设置权限时会调用这些提供程序。您可以通过实现 IPermissionManagementProvider 接口或继承 PermissionManagementProvider 基类来创建自定义提供程序。

示例:

public class CustomPermissionManagementProvider : PermissionManagementProvider
{
    public override string Name => "Custom";

    public CustomPermissionManagementProvider(
        IPermissionGrantRepository permissionGrantRepository,
        IGuidGenerator guidGenerator,
        ICurrentTenant currentTenant)
        : base(
            permissionGrantRepository,
            guidGenerator,
            currentTenant)
    {
    }
}

PermissionManagementProvider 基类已提供默认实现(基于 IPermissionGrantRepository)。您可根据需求重写基类方法。每个提供程序必须具有唯一名称(示例中为 Custom,建议使用简短名称,因为它会随每条权限记录保存至数据库)。

创建提供程序类后,需通过 PermissionManagementOptions 配置类 进行注册:

Configure<PermissionManagementOptions>(options =>
{
    options.ManagementProviders.Add<CustomPermissionManagementProvider>();
});

提供程序的顺序至关重要。系统会按逆序执行提供程序,这意味着此示例中 CustomPermissionManagementProvider 将首先执行。您可将自定义提供程序插入 Providers 列表的任意位置。

相关阅读

在本文档中