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源码分析二十三:Authorization的更多相关文章
- ABP源码分析二:ABP中配置的注册和初始化
一般来说,ASP.NET Web应用程序的第一个执行的方法是Global.asax下定义的Start方法.执行这个方法前HttpApplication 实例必须存在,也就是说其构造函数的执行必然是完成 ...
- ABP源码分析二十四:Notification
NotificationDefinition: 用于封装Notification Definnition 的信息.注意和Notification 的区别,如果把Notification看成是具体的消息 ...
- ABP源码分析三十三:ABP.Web
ABP.Web模块并不复杂,主要完成ABP系统的初始化和一些基础功能的实现. AbpWebApplication : 继承自ASP.Net的HttpApplication类,主要完成下面三件事一,在A ...
- ABP源码分析二十:ApplicationService
IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...
- ABP源码分析二十一:Feature
Feature是什么?Feature就是对function的分类方法,其与function的关系就比如Role和User的关系一样. ABP中Feature具有以下属性: 其中最重要的属性是name, ...
- ABP源码分析二十二:Navigation
MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...
- ABP源码分析二十五:EventBus
IEventData/EventData: 封装了EventData信息,触发event的源对象和时间 IEventBus/EventBus: 定义和实现了了一系列注册,注销和触发事件处理函数的方法. ...
- ABP源码分析二十六:核心框架中的一些其他功能
本文是ABP核心项目源码分析的最后一篇,介绍一些前面遗漏的功能 AbpSession AbpSession: 目前这个和CLR的Session没有什么直接的联系.当然可以自定义的去实现IAbpSess ...
- ABP源码分析二十七:ABP.Entity Framework
IRepository:接口定义了Repository常见的方法 AbpRepositoryBase:实现了IRepository接口的常见方法 EfRepositoryBase:实现了AbpRepo ...
随机推荐
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- 查看w3wp进程占用的内存及.NET内存泄露,死锁分析
一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...
- 漫扯:从polling到Websocket
Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...
- hadoop 2.7.3本地环境运行官方wordcount
hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...
- CoreCRM 开发实录——开始之新项目的技术选择
2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...
- CGI与FastCGI nginx+PHP-FPM
本文转载自CGI与FastCGI 1.当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. ...
- 现代3D图形编程学习-基础简介(3)-什么是opengl (译)
本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...
- 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型
前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...
- Log4Net应用问题
问题 一.日志存储方式 1.txt 2.SQLServer数据库 3.log文件 二.项目类型不同 1winFrom 2webFrom 3MVC 4WPF 5控制台 三.切分依据不同 1.空间大小 2 ...
- ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus
ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...