项目

微服务解决方案:权限管理

您必须拥有ABP商业版或更高许可证,才能创建微服务解决方案。

Administration 微服务负责管理权限。解决方案中的所有服务和应用都会使用它。本文档将说明微服务解决方案中的权限管理机制。

当我们向 /api/abp/application-configuration 发送请求时,网关应用会将请求转发至 Administration 微服务。Administration 微服务会返回应用配置,其中包含当前用户被授予的策略(权限)。您可在此查看应用配置的详细信息:应用配置

由于权限管理是一个基础功能模块,每个微服务都依赖于 Volo.Abp.PermissionManagement.EntityFrameworkCore(或 Volo.Abp.PermissionManagement.MongoDB)包。这些模块提供了检查权限所需的基础设施(例如 IPermissionStore)。此外,Administration 微服务还依赖于 Volo.Abp.PermissionManagement.ApplicationVolo.Abp.PermissionManagement.HttpApiVolo.Abp.PermissionManagement.Domain.OpenIddictVolo.Abp.PermissionManagement.Domain.Identity 包,以管理(授予或撤销)权限。

权限管理

Administration 微服务提供了一套用于管理权限的API。每个微服务都会定义其自身的权限。当微服务启动时,如果 PermissionManagementOptions 中的 SaveStaticPermissionsToDatabase 选项设置为 true(默认值即为 true),它会将其权限注册到相关的权限定义表中。之后,您便可在权限管理对话框中为相关提供者(如 用户角色客户端(OpenIddict应用))查看这些权限。

user-permissions

当您为微服务定义新权限后,需要重启该微服务,以便将新权限注册到权限定义表中。然而,权限定义注册后,admin 角色默认并不拥有该权限。这是因为只有 Administration 微服务会尝试向 admin 角色预置权限。因此,新权限不会自动授予 admin 角色。您需要手动将新权限授予 admin 角色,或者当 Administration 服务重启时,它会自动将新权限授予 admin 角色。

若希望新权限自动授予 admin 角色,您可以创建一个数据种子并使用 IPermissionDataSeeder 服务。例如,Identity 微服务就采用了此方法,因为当首个管理员用户登录时,他们应能编辑用户和角色。您可在 Identity 微服务的 IdentityServiceDataSeeder 类中查看详情。

Administration 服务的权限管理选项

SaveStaticPermissionsToDatabase 默认值为 true,用于将静态权限保存到数据库。每个微服务已将其权限定义添加到相关表中。但还有另一个选项 IsDynamicPermissionStoreEnabled,用于启用动态权限存储。我们只需为 Administration 微服务启用此选项,因为 Administration 微服务是唯一管理权限的服务。所有其他服务和应用使用其自身的权限定义,无需知晓其他服务的权限。

您可在 Administration 微服务模块的 ConfigurePermissionManagement 方法中看到此选项:

private void ConfigurePermissionManagement()
{
    Configure<PermissionManagementOptions>(options =>
    {
        options.IsDynamicPermissionStoreEnabled = true;
    });
}

创建新权限

您可以在相关微服务 Contracts 项目中的 MicroservicenamePermissionDefinitionProvider 类中定义新权限。例如,Identity 微服务拥有一个 IdentityServicePermissionDefinitionProvider 类。您可在 Identity 微服务中查看详情。

public class IdentityServicePermissionDefinitionProvider : PermissionDefinitionProvider
{
    public override void Define(IPermissionDefinitionContext context)
    {
        //var myGroup = context.AddGroup(IdentityServicePermissions.GroupName);
    }

    private static LocalizableString L(string name)
    {
        return LocalizableString.Create<IdentityServiceResource>(name);
    }
}

由于与身份相关的权限来自Identity模块,因此无需定义新权限。但如果您有需要,也可以为 Identity 微服务添加新权限。


在本文档中