• ABP源码分析二十三:Authorization


    Permission:用于定义一个Permission,一个permission可以包含多个子Permission.

     

    PermissionDictionary:继承自Dictionary<string, Permission>类,很明显是一个用于存储permission对象的字典。

    IPermissionDefinitionContext/PermissionDefinitionContextBase: 这对接口和实现用于新建一个Permission到PermissionDictionary中,和根据permission name从PermissionDictionary返回一个permission.

    IPermissionManager:该接口定义了一些返回permission的方法。

    PermissionManager:在ABP这是一个单例实例,继承了PermissionDefinitionContextBase类,实现了IPermissionManager的四个方法。 PermissionManager在Initialize方法中会实例化系统的Permissio并存入PermissionDictionary中。具体是通过调用AuthorizationProvider的SetPermissions的方法实现的。这边的做法和FeatureManager通过FeatureProvider初始化FeatureDictionary一致,也和NavigationManager通过NavigationProvider初始化menus一致的。

     

    PermissionManager的Initialize方法 是在AbpKernelModule的PostInitialize的方法中被调用的。

     

    AuthorizationProvider: 功能类似于FeatureProvider。抽象基类,用于设置PermissionManager的PermissionDictionary。 Abp框架只提供了抽象类,下面代码是一个简单的示例。实际项目中可以创建自定义AuthorizationProvider来从数据库中读取Permission信息来填充到PermissionManager对象中。

    IAuthorizationConfiguration/AuthorizationConfiguration: PermissionManager通过具体的AuthorizationProvider来初始化PermissionDictionary。但是ABP核心模块处于最底层,怎么能知道上层定义的AuthorizationProvider的类型呢? AuthorizationConfiguration为解决这个问题引入了AuthorizationProvider配置项。AuthorizationProvider就是一个Type 列表 (ITypeList<AuthorizationProvider>),注意是AuthorizationProvider的Type,不是实例。在需要AuthorizationProvider的地方,可以使用容器根据Type构造出实例。

     

    IAbpAuthorizeAttribute/AbpAuthorizeAttribute: AbpAuthorize特性用于标注applicationService中只能被授权用户使用的方法。

     

    AuthorizationInterceptorRegistrar:用于将AuthorizationInterceptor拦截器注册到所有实现IApplicationService的类的componentmodel中。

    AuthorizationInterceptor:拦截器,拦截所有标注了AbpAuthorize特性的方法。

     

    IPermissionDependencyContext/PermissionDependencyContext: 上下文类,作为方法的参数。没有特别的业务逻辑。

     

    IPermissionDependency:定义了一个用于check permission方法的接口。SimplePermissionDependency是其一个最简单的实现。其可以用作为其他对象的一个属性,以帮助其他对象得到检查permission的能力。比如NotificationDefinition定义了一个IPermissionDependency类型的属性。当ABP获取某个用户可见的Notification种类时,可以通过NotificationDefinitionIPermissionDependency类型的属性去检查用户是否对该类Notification有接受权限。

    IPermissionChecker:定义了实际上用于完成permission check的方法,其实现一般都要访问数据库的。所以在ABP底层框架中只有一个其dummy的实现-NullPermissionChecker。

    IAuthorizeAttributeHelper/AuthorizeAttributeHelper: 是对IPermissionChecker的更近一步的封装同时提供了以AuthorizeAttribute为参数的校验方法,以方便AuthorizationInterceptor的调用。

     

    StaticPermissionChecker:用于从容器生成IPermissionChecker接口的实现,如果没有自定义的IPermissionChecker实现被注入到容器中则返回NullPermissionChecker。这边通过Lazy实现延迟加载。

     

     

    接下来看看Abp.zero是如何注入IPermissionChecker

    Abp.zero的原生框架定义了PermissionChecker的抽象类。

    实际项目中则会定义如下继承自PermissionChecker的抽象类的类

    最后在MoudleInitialize中注入其到Abp底层框架的容器中去。

     

    返回ABP源码分析系列文章目录

  • 相关阅读:
    16进制字符串的转换
    UINavigationBar统一修改导航条样式
    3D touch
    WKWebView
    CAEmitterLayer 粒子效果(发射器)
    SDWebImage下载图片的使用
    PHP之string之str_shuffle()函数使用
    Redis之hiredis API (String)
    Redis之数据类型Sting字符串
    PHP之string之str_repeat()函数使用
  • 原文地址:https://www.cnblogs.com/1zhk/p/5361118.html
Copyright © 2020-2023  润新知