Abp vNext源码分析-功能模块和权限模块
功能模块
功能管理-FeatureManagement是在多租户应用程序中使用,检查定义的功能是否对当前租户有效,功能是否启用。Abp系统功能定义,类似于权限功能一种延伸。
FeatureDefinition: 功能定义FeatureGroupDefinition: 功能组定义FeatureValue: 功能值,记录功能是否可用IFeatureValueProvider: 功能值提供器,负责检查功能是否可用。
一般会结合功能存储IFeatureStore使用
1 | public abstract class FeatureValueProvider : IFeatureValueProvider, ITransientDependency |
IFeatureChecker: 功能检查,负责连接功能值提供器和功能定义提供器。IFeatureDefinitionContext: 功能定义上下文,包含功能定义及操作功能定义
功能检查
1 | public interface IFeatureChecker |
功能定义提供器-FeatureDefinitionProvider
IFeatureDefinitionProvider: 功能定义提供器IFeatureDefinitionManager: 功能管理器
1 | public interface IFeatureDefinitionManager |
继承FeatureDefinitionProvider,重写Define方法,调用IFeatureDefinitionContext内部方法AddGroup,添加功能组定义,FeatureGroupDefinition有AddFeature,可以增加子功能
功能使用
RequiresFeatureAttribute: 修饰于方法前,针对特定功能开放DefaultValueFeatureValueProvider: 默认功能值提供器,直接返回功能定义,不作限制TenantFeatureValueProvider: 租户功能值提供器,限制租户使用的功能EditionFeatureValueProvider: 编辑功能值提供器,限制用户使用可编辑功能
功能存储
IFeatureStore: 从仓储中取功能值信息
权限模块
权限模块-PermissionManagement,是用于检查用户是否允许在应用程序中执行某些特定的操作。
Abp继承了ASP.NET Core Authorization,通过增加permissions作为自动策略使得允许授权系统在应用程序服务中可用
权限定义
PermissionDefinition: 单一权限,例如增删改PermissionGroupDefinition: 权限组,例如对A的增删改,A就是分组
权限定义管理器
IPermissionDefinitionContext: 权限定义上下文,顾名思义,就是把权限和权限组定义存于这个类中IPermissionDefinitionProvider: 权限定义提供者,负责在权限定义上下文绑定权限和权限组定义IPermissionDefinitionManager: 权限定义管理,负责将上下文中的权限定义整合处理,对外提供调用
IPermissionDefinitionProvider接口定义
1 | public interface IPermissionDefinitionProvider |
开发者通过继承PermissionDefinitionProvider,在Define()方法内进行注册权限定义即可。
Abp框架会自动注入所有实现了IPermissionDefinitionProvider的类,在Abp.Authorization模块内部注册,在
自动注入方法
1 | private static void AutoAddDefinitionProviders(IServiceCollection services) |
IPermissionDefinitionManager接口定义
1 | public interface IPermissionDefinitionManager |
管理器会创建IPermissionDefinitionContext并传递给所有的PermissionDefinitionProvider,然后从上下文中取出权限保存管理器内部,绑定权限时再通过管理器获取到系统注册的所有权限
1 | protected virtual Dictionary<string, PermissionGroupDefinition> CreatePermissionGroupDefinitions() |
创建一个继承自 PermissionDefinitionProvider 的类,如下所示:
1 | using Volo.Abp.Authorization.Permissions; |
Abp会自动发现这个类,不需要进行配置
你需要在 Define 方法中添加权限组或者获取已存在的权限组,并向权限组中添加权限.
在定义权限后就可以在ASP.NET Core权限系统中当做策略名称使用.
权限值
IPermissionValueProviderIPermissionValuesCheckContext: 负责承载权限值检查的上下文,含权限定义、用户声明
负责生成权限值提供者PermissionValueProvider,通过使用IPermissionStore取权限值检查IPermissionValuesCheckContext 上下文中ClaimsPrincipal是否获得权限许可。
Abp提供了三种权限值实现,分别是Client、Role、User
ClientPermissionValueProvider: 从当前声明中拿到当前客户端并检查客户端是否具有指定的权限. 这在没有当前登录用户的客户端交互特别有用. 客户端声明由AbpClaimTypes.ClientId静态属性定义RolePermissionValueProvider: 从当前的声明中拿到授予当前用户的角色集合并且判断角色是否具有指定的权限. 角色声明由AbpClaimTypes.Role静态属性定义UserPermissionValueProvider: 从当前的声明中拿到当前用户ID并检查用户授权. 用户声明由AbpClaimTypes.UserId静态属性定义
开发者可以根据需求自己PermissionValueProvider拓展权限检查系统
示例
1 | public class SystemAdminPermissionValueProvider : PermissionValueProvider |
示例SystemAdminPermissionValueProvider允许声明User_Type值为SystemAdmin的用户授予所有权限. 通常在Provider中使用当前声明和 IPermissionStore.
PermissionValueProvider 的 CheckAsync 应该返回下面三个值之一:
PermissionGrantResult.Granted授予用户权限,如果没有其他的授权值提供程序返回Prohibited, 那么最后会返回Granted.PermissionGrantResult.Prohibited禁止授权用户,任何一个授权值提供程序返回了Prohibited, 那么其他的提供程序返回的值都不再重要.PermissionGrantResult.Undefined代表当前无法确定是否授予或禁止权限, 返回UnDefined由其他权限值提供程序检查权限.
定义Provider后将其添加到 AbpPermissionOptions,如下所示:
1 | Configure<AbpPermissionOptions>(options => |
权限检查管理器
IPermissionValueProviderManager: 负责提供权限设定值,可以从存储中获取,也可以从配置里获取
负责管理应用程序中或者权限存储中的权限值,统一访问管理器
IPermissionValueProviderManager接口定义
1 | public interface IPermissionValueProviderManager |
权限管理
Abp连接权限定义和权限值
IPermissionChecker: 权限检查
权限检查类
1 | public interface IPermissionChecker |
结合微软权限策略
PermissionRequirement: 实现微软官方IAuthorizationRequirement,Abp自定义权限拓展PermissionRequirementHandler: 实现微软官方AuthorizationHandler<PermissionRequirement>,对权限值、权限定义、用户声明进行鉴权
最终PermissionRequirementHandler会使用IPermissionChecker权限检查,Abp默认实现了PermissionChecker。PermissionChecker用到了上述IPermissionDefinitionManager、IPermissionValueProviderManager、ICurrentPrincipalAccessor、ICurrentTenant。
微软提供的鉴权规范
AuthorizationPolicy: 微软提供集认证方案和若干IAuthorizationRequirement于一身DefaultAuthorizationPolicyProvider: 微软默认实现策略提供器IAuthorizationRequirement: 权限拓展AuthorizationHandler: 权限处理
IAbpAuthorizationPolicyProvider继承了IAuthorizationPolicyProvider
参阅 基于策略的授权 文档了解如何自定义策略.
1 | public interface IAbpAuthorizationPolicyProvider : IAuthorizationPolicyProvider |
AbpAuthorizationPolicyProvider继承AspNetCore提供的DefaultAuthorizationPolicyProvider
该提供器负责从PermissionDefinitionManager获取权限定义生成AuthorizationPolicy,
权限存储
IPermissionStore: 存储权限值
负责实现权限存储,从各自领域的仓储中取出权限值,Abp的Permission模块已经实现这块功能。
