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种类时,可以通过NotificationDefinition的IPermissionDependency类型的属性去检查用户是否对该类Notification有接受权限。

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

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

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

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

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

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

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

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

【转】ABP源码分析二十三:Authorization相关推荐

  1. 【转】ABP源码分析三十三:ABP.Web

    ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事 一,在 ...

  2. 【转】ABP源码分析二十四:Notification

    NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...

  3. 【转】ABP源码分析二:ABP中配置的注册和初始化

    一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...

  4. 【转】ABP源码分析四十三:ZERO的本地化

    ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库对本地化功能进行管理.其通过数据库保存本地化语言及其资源. ApplicationLanguage:代表本地化语言的实体类.一种 ...

  5. 【转】ABP源码分析二十九:ABP.MongoDb

    这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...

  6. 【转】ABP源码分析二十八:ABP.MemoryDB

    这个模块简单,且无实际作用(该模块用于支持ABP框架单元测试的).一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能 ...

  7. 【转】ABP源码分析二十七:ABP.Entity Framework

    IRepository:接口定义了Repository常见的方法 AbpRepositoryBase:实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepo ...

  8. 【转】ABP源码分析二十六:核心框架中的一些其他功能

    本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...

  9. 【转】ABP源码分析二十五:EventBus

    IEventData/EventData: 封装了EventData信息,触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法. ...

最新文章

  1. 索引贴——移动开发(.Net CF 停止更新)
  2. C#/VB.NET 给Word文档添加/撤销书签
  3. iOS架构-静态库.framework之资源文件打包bundle(6)
  4. 学python需要什么基础知识-Python学习(一)基础知识
  5. 7.2 TensorFlow笔记(基础篇): 生成TFRecords文件
  6. c语言赋值小数,c语言中将一个浮点型赋值给整型时,会不会四舍五入?
  7. jmeter展示内存cpu_基于Docker的jmeter弹性压测(2)监控
  8. python继承如何进行引用传递的区别_python在什么情况下会引用传递呢?
  9. pyqt label上的图片旋转_python中tkinter入门之config、Scale、Canvas和导入图片
  10. css3实现的精美菜单
  11. linux运行出现断错误,在linux下代码运行出现段错误,求大神
  12. 利用WinSock进行无连接的通信
  13. Luogu2680 [NOIP2015 提高组] 运输计划
  14. CSS命名规范--BEM
  15. 恶魔奶爸语法10-12课
  16. 整顿风暴后网址导航将何去何从 如何孕育重生
  17. 常见的内存错误java_Java虚拟机常见内存溢出错误汇总,Java中常见的坑看了可以少走点弯路...
  18. 动态链接 lazy binding 的原理与 GOT 表的保留表项
  19. 为什么E-GREEDY算法中e越小,性能会更好
  20. 无线获能 — 系最适合低功耗及无源物联网能量收集技术

热门文章

  1. VNC源码研究(一)
  2. shell 脚本实现退点输出
  3. [Docker]Docker拉取,上传镜像到Harbor仓库
  4. [转]Oh My Zsh,安装,主题配置
  5. Hadoop-HBASE案例分析-Hadoop学习笔记二
  6. iOS开发——高级技术本地化与国际化详解
  7. IOS高级编程之二:IOS的数据存储与IO
  8. dart 乘方运算符_Dart系列-运算符
  9. mysql部门人员排序设计_MySQL数据库访问性能优化
  10. 解决使用Servlet输出乱码问题(一行代码解决一切)