审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作。

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源码分析系列文章目录

【转】ABP源码分析十九:Auditing相关推荐

  1. 【转】ABP源码分析十八:UI Inputs

    以下图中描述的接口和类都在Abp项目的Runtime/Validation, UI/Inputs目录下的.在当前版本的ABP(0.83)中这些接口和类并没有实际使用到.阅读代码时可以忽略,无需浪费时间 ...

  2. 【转】ABP源码分析十六:DTO的设计

    IDTO:空接口,用于标注Dto对象. ComboboxItemDto:用于combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用于na ...

  3. 【转】ABP源码分析十五:ABP中的实用扩展方法

    类名 扩展的类型 方法名 参数 作用 XmlNodeExtensions XmlNode GetAttributeValueOrNull attributeName Gets an   attribu ...

  4. 【转】ABP源码分析十四:Entity的设计

    IEntity<TPrimaryKey>: 封装了PrimaryKey:Id,这是一个泛型类型 IEntity: 封装了PrimaryKey:Id,这是一个int类型 Entity< ...

  5. 【转】ABP源码分析十二:本地化

    本文逐个分析ABP中涉及到localization的接口和类,以及他们之间的关系.本地化主要涉及两个方面:一个是语言(Language)的管理,这部分相对简单.另一个是语言对应得本地化资源(Local ...

  6. 【转】ABP源码分析十:Unit Of Work

    ABP以AOP的方式实现UnitOfWork功能.通过UnitOfWorkRegistrar将UnitOfWorkInterceptor在某个类被注册到IOCContainner的时候,一并添加到该类 ...

  7. [Abp 源码分析]十六、后台作业与后台工作者

    0. 简介 在某些时候我们可能会需要执行后台任务,或者是执行一些周期性的任务.比如说可能每隔 1 个小时要清除某个临时文件夹内的数据,可能用户会要针对某一个用户群来群发一组短信.前面这些就是典型的应用 ...

  8. 【转】ABP源码分析一:整体项目结构及目录

    ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...

  9. 【转】ABP源码分析二十九:ABP.MongoDb

    这个Module通过建立一个MongoDbRepositoryBase<TEntity> 基类,封装了对MongoDb数据库的操作. 这个module通过引用MongoDB.Driver, ...

最新文章

  1. c js html页面进度条,js实现进度条的方法
  2. 我知道你会用Jupyter Notebook,但这些插件你都会了吗?
  3. Android实战】DroidPlugin插件化应用分析
  4. jmeter进行https协议的测试
  5. excel导航窗格_Excel小技巧16:在每天的某个时刻自动打开特定工作簿
  6. 链表的代码实现【数据结构F】
  7. linux查询.gz日志,linux2-查日志
  8. 解决 | 老司机都无法解决的事情,谁能解决?
  9. java中字节码_聊聊Java的字节码
  10. 国内首例!云服务器侵权案件:阿里云胜诉,不承担法律责任
  11. linux软链接删除重新创显示,Linux 下如何创建 /删除软连接
  12. 应用推荐:Fluent Reader
  13. 基于GIS+BIM技术的高速公路征地拆迁管理系统应用
  14. css span img,css设置span和img垂直居中(设置line-height失效)
  15. 许三多身上的职业精神
  16. python优雅编程之旅
  17. 【python爬虫】每日获取强智教务系统课表,并发送短信到学生手机
  18. 苏东坡有一句“八风吹不动,独坐紫金台“ 人生智慧
  19. HBuilderX 打包问题
  20. MFC封装的base64编码解码函数

热门文章

  1. 【数据结构与算法-java实现】三 Java数组类实现
  2. 基于上一篇AS项目依赖库问题的优化解决方案
  3. css用hover制作下拉菜单
  4. python - hadoop,mapreduce demo
  5. HDU 1257 最少拦截系统(贪心)
  6. 【LINUX/UNIX网络编程】之使用消息队列,信号量和命名管道实现的多进程服务器(多人群聊系统)...
  7. 浅尝EffectiveCSharp_1
  8. leetcode之回溯backtracing专题1
  9. java非堆内存_java – 监视JVM的非堆内存使用情况
  10. php8vsgo,服务端 I/O 性能:Node、PHP、Java、Go 的对比