zoukankan      html  css  js  c++  java
  • 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源码分析系列文章目录

  • 相关阅读:
    css水平垂直居中问题
    关系型数据库四大特性
    C++读取csv文件&&收获到的知识
    恒生面试记录
    SQL数据库操作命令
    安防产品知识记录
    学会求助(带着自己的理解去和别人探讨解决方案),处理问题责任清晰,如果不清楚可以问主管.
    一个简单又不简单的socket例子
    C++面试题总结
    大华电话面试
  • 原文地址:https://www.cnblogs.com/1zhk/p/5342947.html
Copyright © 2011-2022 走看看