【转】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种类时,可以通过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相关推荐
- 【转】ABP源码分析三十三:ABP.Web
ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事 一,在 ...
- 【转】ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
- 【转】ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数必然已完成了执行 ...
- 【转】ABP源码分析四十三:ZERO的本地化
ABP Zero模块扩展了ABP基础框架中的本地化功能,实现了通过数据库对本地化功能进行管理.其通过数据库保存本地化语言及其资源. ApplicationLanguage:代表本地化语言的实体类.一种 ...
- 【转】ABP源码分析二十九:ABP.MongoDb
这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...
- 【转】ABP源码分析二十八:ABP.MemoryDB
这个模块简单,且无实际作用(该模块用于支持ABP框架单元测试的).一般实际项目中都有用数据库做持久化,用了数据库就无法用这个MemoryDB 模块了.原因在于ABP限制了UnitOfWork的类型只能 ...
- 【转】ABP源码分析二十七:ABP.Entity Framework
IRepository:接口定义了Repository常见的方法 AbpRepositoryBase:实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepo ...
- 【转】ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...
- 【转】ABP源码分析二十五:EventBus
IEventData/EventData: 封装了EventData信息,触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法. ...
最新文章
- 索引贴——移动开发(.Net CF 停止更新)
- C#/VB.NET 给Word文档添加/撤销书签
- iOS架构-静态库.framework之资源文件打包bundle(6)
- 学python需要什么基础知识-Python学习(一)基础知识
- 7.2 TensorFlow笔记(基础篇): 生成TFRecords文件
- c语言赋值小数,c语言中将一个浮点型赋值给整型时,会不会四舍五入?
- jmeter展示内存cpu_基于Docker的jmeter弹性压测(2)监控
- python继承如何进行引用传递的区别_python在什么情况下会引用传递呢?
- pyqt label上的图片旋转_python中tkinter入门之config、Scale、Canvas和导入图片
- css3实现的精美菜单
- linux运行出现断错误,在linux下代码运行出现段错误,求大神
- 利用WinSock进行无连接的通信
- Luogu2680 [NOIP2015 提高组] 运输计划
- CSS命名规范--BEM
- 恶魔奶爸语法10-12课
- 整顿风暴后网址导航将何去何从 如何孕育重生
- 常见的内存错误java_Java虚拟机常见内存溢出错误汇总,Java中常见的坑看了可以少走点弯路...
- 动态链接 lazy binding 的原理与 GOT 表的保留表项
- 为什么E-GREEDY算法中e越小,性能会更好
- 无线获能 — 系最适合低功耗及无源物联网能量收集技术