ABP源码分析十九:Auditing
审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作。
AuditInfo:定义如下图中需要被Audit的信息。

AuditedAttribute: 用于标识一个方法或一个类的所有方法都需要启用Auditing功能。
DisableAuditingAttribute:用于标识一个方法或一个类的所有方法都需要关闭Auditing功能。
IMvcControllersAuditingConfiguration/MvcControllersAuditingConfiguration : 用于配置是否启用对MVC Controller及其Action的Auditing功能。

IAuditingConfiguration/AuditingConfiguration: 可以配置如下图中的四个属性,除了Selectors外其他三个属性都很容易理解。

NamedTypeSelector:类型选择器,这个对象的核心属性是一个以type为输入参数,返回bool类型的委托predicate.

IAuditingSelectorList/AuditingSelectorList : 这是一个NamedTypeSelector对象的集合

如下是AbpKernelModule在PreInitialize方法中给IAuditingConfiguration对象配置了一个类型选择器(用于筛选出IApplicationService对象),稍后所有IApplicationService对象都会被注入Auditing 拦截器。

IAuditInfoProvider:这个接口定义一个方法用于完善AuditInfo对象。为什么要定义一个这样的接口和方法呢?ABP核心模块处于最底层,有些上层的信息在这一层无法直接取得(比如浏览器信息)。ABP的做法是在上层实现IAuditInfoProvider,然后将其register到底层的容器中。处于底层ABP的核心模块则从resolve出这个对象,然后调用该对象的fill方法来完善AuditInfo。
NullAuditInfoProvider : 空的IAuditInfoProvider实现,这个是ABP中的缺省的IAuditInfoProvider的实现。
WebAuditInfoProvider :这个IAuditInfoProvider对象就是上面所说的上层的IAuditInfoProvider实现。这个类就是在Abp.Web模块中实现的。(注意:整个项目中除了NullAuditInfoProvider 只能有一个自定义的IAuditInfoProvider实现。也就是说实际项目中无法直接创建自定义的IAuditInfoProvider,因为Abp.Web模块中已经有一个了。)

ABP是如何实现在方法执行时自动完成Auditing的呢(俗话叫AOP)?通过注入到IApplicationService对象的componentmodel上的AuditingInterceptor拦截器实现的。AuditingInterceptor拦截器是由AuditingInterceptorRegistrar对象的Initialize方法注入的。而AuditingInterceptorRegistrar的Initialize会在AbpKernelModule的Initialize的时候被调用。(见下面代码截图)



满足以下四个条件的方法都会被AuditingInterceptor拦截:
1.IApplicationService的实例中的方法
2.添加了AuditedAttribute的类的实例的方法
3.加了AuditedAttribute的方法
4.通过IAuditingConfiguration对象的Selectors属性添加需要被auditing的类型。
那些方法会执行的时候会被真正加入Auditing功能呢?具体可参见AuditingHelper的代码。大概总结如下条件(同时满足):
1.必须满足AuditingConfiguration中的IsEnabled为true
2.如果session为空,则configuration.IsEnabledForAnonymousUsers也必须为true
3.Public 方法
AuditingInterceptor生成AuditInfo实例,然后调用IAuditingStore类实例执行AuditInfo持久化。
IAuditingStore:这个接口定义持久化AuditInfo的方法
SimpleLogAuditingStore:ABP底层框架自带的IAuditingStore实现是SimpleLogAuditingStore,可以把下图中5个信息持久化到日志中。module-zero项目中有个更为完整的实现。
实现Auditing功能的相关接口和对象的关系图

ABP源码分析十九:Auditing的更多相关文章
- C# DateTime的11种构造函数 [Abp 源码分析]十五、自动审计记录 .Net 登陆的时候添加验证码 使用Topshelf开发Windows服务、记录日志 日常杂记——C#验证码 c#_生成图片式验证码 C# 利用SharpZipLib生成压缩包 Sql2012如何将远程服务器数据库及表、表结构、表数据导入本地数据库
C# DateTime的11种构造函数 别的也不多说没直接贴代码 using System; using System.Collections.Generic; using System.Glob ...
- ABP源码分析十:Unit Of Work
ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...
- ABP源码分析十二:本地化
本文逐个分析ABP中涉及到locaization的接口和类,以及相互之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Locali ...
- ABP源码分析十四:Entity的设计
IEntity<TPrimaryKey>: 封装了PrimaryKey:Id,这是一个泛型类型 IEntity: 封装了PrimaryKey:Id,这是一个int类型 Entity< ...
- ABP源码分析十五:ABP中的实用扩展方法
类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an attribu ...
- ABP源码分析十六:DTO的设计
IDTO:空接口,用于标注Dto对象. ComboboxItemDto:用于combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用于na ...
- ABP源码分析十八:UI Inputs
以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...
- [Abp 源码分析]十二、多租户体系与权限验证
0.简介 承接上篇文章我们会在这篇文章详细解说一下 Abp 是如何结合 IPermissionChecker 与 IFeatureChecker 来实现一个完整的多租户系统的权限校验的. 1.多租户的 ...
- jQuery 源码分析(十九) DOM遍历模块详解
jQuery的DOM遍历模块对DOM模型的原生属性parentNode.childNodes.firstChild.lastChild.previousSibling.nextSibling进行了封装 ...
随机推荐
- Fis3的前端模块化之路[基础篇]
Fis3版本:v3.4.22 fis3是一个构建工具 解决前端开发中自动化工具.性能优化.模块化框架.开发规范.代码部署.开发流程等问题. 安装 npm install -g fis3 运行 fis3 ...
- mysql 学习总结
MYSQL的增.删.查.改 注册.授权 #创建一个对数据库中的表有一些操作权限的用户,其中OPERATION可以用all privileges替换,DBNAME.TABLENAME可以用*替换,表 ...
- 通过三次优化,我将gif加载优化了16.9%
WeTest 导读 现在app越来越炫,动不动就搞点动画,复杂的动画用原生实现起来挺复杂,如是就搞起gif播放动画的形式,节省开发成本. 背 景 设计同学准备给一个png序列,开发读取png序列, ...
- WebGIS项目中利用mysql控制点库进行千万条数据坐标转换时的分表分区优化方案
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1. 背景 项目中有1000万条历史案卷,为某地方坐标系数据,我们的真实 ...
- ASP.NET Core 中文文档 第四章 MVC(4.6)Areas(区域)
原文:Areas 作者:Dhananjay Kumar 和 Rick Anderson 翻译:耿晓亮(Blue) 校对:许登洋(Seay) Areas 是 ASP.NET MVC 用来将相关功能组织成 ...
- .NET平台和C#编程的总结
第一章 简单认识.NET框架 (1)首先我们得知道 .NET框架具有两个主要组件:公共语言进行时CLR(Common Language Runtime)和框架类库FCL(Framework ...
- 【干货分享】流程DEMO-制度发文和干部任免
流程名: 制度发文和干部任免 业务描述: 当员工在该出勤的工作日出勤但漏打卡时,于一周内填写补打卡申请. 流程相关文件: 流程包.xml 流程说明: 直接导入流程包文件,即可使用本流程 表单: ...
- H3 BPM引擎API接口
引擎API接口通过 Engine 对象进行访问,这个是唯一入口. 示例1:获取组织机构对象 this.Engine.Organization.GetUnit("组织ID"); 示例 ...
- 如何区别数据库删除语句drop与delete与truncate?
1.delete:删除数据表中的行(可以删除某一行,也可以在不删除数据表的情况下删除所有行) 删除某一行:delete from 数据表名称 where 列名称=值: 删除所有行:delete*fro ...
- linux启动SSH及开机自动启动
本文地址 分享提纲: 1.查看是否启动 2. 设置自动启动 1.[查看是否启动] 启动SSH服务 “/etc/init.d/sshd start”.然后用netstat -antulp | grep ...