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. 关于ubuntu实机与虚机互相copy

    我的开发环境是在ubuntu上的,但是ubuntu上没有官方支持的QQ,有些不太方便,所以在上面虚了一个Win7(先是win10,但是win10最新版本太坑了,不说了),不过经常会出现复制文件,或者文 ...

  2. 关于自己写C++的一点风格

    现在,我学了很长时间的C++,但是自己就是无法精通.许多知识是入门书上没有的.现在写C++最重要的就是风格问题. 我现在的C++风格: 把自己所有的东西都放在一个名称空间下. 没有全局的函数,有的函数 ...

  3. 让kindeditor显示高亮代码

    kindeditor4.x代码高亮功能默认使用的是prettify插件,prettify是Google提供的一款源代码语法高亮着色器,它提供一种简单的形式来着色HTML页面上的程序代码,实现方式如下: ...

  4. Kafka副本管理—— 为何去掉replica.lag.max.messages参数

    今天查看Kafka 0.10.0的官方文档,发现了这样一句话:Configuration parameter replica.lag.max.messages was removed. Partiti ...

  5. 说一说python的牛比与不爽

    本人写了10年php了.今年开始改写python了.不是说php有什么不好,php在自己的势力范围内还是很牛比的.只是我已经不能满足于php那两亩地了. 习惯了脚本,所以很自然就过度到python了. ...

  6. 【Java学习系列】第3课--Java 高级教程

    本文地址 可以拜读: 从零开始学 Java 分享提纲: 1. Java数据结构 2. Java 集合框架 3. Java泛型 4. Java序列化 5. Java网络编程 6. Java发送Email ...

  7. win7下利用ftp实现华为路由器的上传和下载

    win7下利用ftp实现华为路由器的上传和下载 1.  Win7下ftp的安装和配置 (1)开始->控制面板->程序->程序和功能->打开或关闭Windows功能 (2)在Wi ...

  8. HA 高可用软件系统保养指南

    又过了一年 618,六月是公司一年一度的大促月,一般提前一个月各系统就会减少需求和功能的开发,转而更多去关注系统可用性.稳定性和管控性等方面的非功能需求.大促前的准备工作一般叫作「备战」,可以把线上运 ...

  9. (转)从0开始搭建SQL Server AlwaysOn 第一篇(配置域控+域用户DCADMIN)

    原文地址: http://www.cnblogs.com/lyhabc/p/4678330.html 实验环境: 准备工作 软件准备 (1) SQL Server 2012 (2) Windows S ...

  10. VPN连接常见错误汇总

    提示远程服务器没有响应. 这种情况有两种情况,一种是远程服务器出现故障.另一种是自己的电脑出现问题,具体原因我还没有找到,但是可以肯定的是注册表除了问题,一个终极的解决办法就是把注册表替换了.先将HK ...