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中配置的注册和初始化

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

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

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

  3. ABP源码分析三十三:ABP.Web

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

  4. ABP源码分析二十:ApplicationService

    IApplicationService : 空接口,起标识作用.所有实现了IApplicationService 的类都会被自动注入到容器中.同时所有IApplicationService对象都会被注 ...

  5. ABP源码分析二十一:Feature

    Feature是什么?Feature就是对function的分类方法,其与function的关系就比如Role和User的关系一样. ABP中Feature具有以下属性: 其中最重要的属性是name, ...

  6. ABP源码分析二十二:Navigation

    MenuDefinition:封装了导航栏上的主菜单的属性. MenuItemDefinition:封装了主菜单的子菜单的属性.子菜单可以引用其他子菜单构成一个菜单树 UserMenu/UserMen ...

  7. ABP源码分析二十五:EventBus

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

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

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

  9. ABP源码分析二十七:ABP.Entity Framework

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

随机推荐

  1. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  2. 查看w3wp进程占用的内存及.NET内存泄露,死锁分析

    一 基础知识 在分析之前,先上一张图: 从上面可以看到,这个w3wp进程占用了376M内存,启动了54个线程. 在使用windbg查看之前,看到的进程含有 *32 字样,意思是在64位机器上已32位方 ...

  3. 漫扯:从polling到Websocket

    Http被设计成了一个单向的通信的协议,即客户端发起一个request,然后服务器回应一个response.这让服务器很为恼火:我特么才是老大,我居然不能给小弟发消息... 轮询 老大发火了,小弟们自 ...

  4. hadoop 2.7.3本地环境运行官方wordcount

    hadoop 2.7.3本地环境运行官方wordcount 基本环境: 系统:win7 虚机环境:virtualBox 虚机:centos 7 hadoop版本:2.7.3 本次先以独立模式(本地模式 ...

  5. CoreCRM 开发实录——开始之新项目的技术选择

    2016年11月,接受了一个工作,是对"悟空CRM"进行一些修补.这是一个不错的 CRM,开源,并提供一个 SaaS 的服务.正好微软的 .NET Core 和 ASP.NET C ...

  6. CGI与FastCGI nginx+PHP-FPM

    本文转载自CGI与FastCGI 1.当我们在谈到cgi的时候,我们在讨论什么 最早的Web服务器简单地响应浏览器发来的HTTP请求,并将存储在服务器上的HTML文件返回给浏览器,也就是静态html. ...

  7. 现代3D图形编程学习-基础简介(3)-什么是opengl (译)

    本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...

  8. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  9. Log4Net应用问题

    问题 一.日志存储方式 1.txt 2.SQLServer数据库 3.log文件 二.项目类型不同 1winFrom 2webFrom 3MVC 4WPF 5控制台 三.切分依据不同 1.空间大小 2 ...

  10. ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus

    ASP.NET Linux部署(2) - MS Owin + WebApi + Mono + Jexus 本文承接我的上一篇博文: ASP.NET 5 Linux部署,那篇文章主要是针对最新的ASP. ...