本节内容:

  • 简介
  • 关于 IAuditingStore
  • 配置
  • 通过特性启用/禁用
  • 注意

 

简介

维基百科:“一个审计追踪(也叫审计日志)是一个安全相关的时序记录、记录组、和/或记录源和目标,作为任何时候一个特殊操作带来影响的一序列活动的书面文件”。

ABP提供一个基础框架来自动记录所有与应用的交互,它能记录有意的方法调用和调用者信息与参数。

基本上,保存的字段有:相关的租户id,调用者id,被调用的服务名(被调用方法的类名),被调用的方法名,执行参数(序列化成Json),执行时间,执行时长(毫秒),客户端IP,客户端电脑名和异常(如果方法抛出一个异常)。

有了这些信息,我们不仅能知道谁做了操作,也能测量应用的性能和观察异常,甚至更多,如你可以统计你应用的使用频次。

审计系统使用IAbpSeesion来获取当前UserId和TenantId。

应用服务、Mvc控制器、Web Api和Asp.net Core方法默认情况下被自动审计。

 关于 IAuditingStore

审计系统使用IAuditingStore来保存审计信息,虽然你可以用你自己的方式实现它,但在module-zero项目里已经完全实现。如果你没有实现它,SimpleLogAuditingStore会被使用,它把审计信息写入日志。

 

配置

为配置审计,你可以在你的模块的PreInitialize方法里使用Configuration.Auditing属性。审计默认可用,你可以用如下方式禁用它:



public class MyModule : AbpModule
{
    public override void PreInitialize()
    {
        Configuration.Auditing.IsEnabled = false;
    }

    //...
}



 

这里有一个审计配置列表:

  • IsEnabled:启用/禁用整个审计系统,默认:true。
  • IsEnabledForAnonymousUsers:如果设为true,在用户未登录系统的情况下,也会保存审核日志。默认为:false。
  • Selectors:选择其它类来保存审核日志

Selectors是一个谓词列表,用其它类型来保存审核日志,一个选择器有一个唯一的名称和一个谓词,在这个列表里唯一默认的选择器是用来选择应用服务类的,它的定义如下所示:



Configuration.Auditing.Selectors.Add(
    new NamedTypeSelector(
        "Abp.ApplicationServices",
        type => typeof (IApplicationService).IsAssignableFrom(type)
    )
);



 

你可在你的模块的PreInitialize方法里添加自己的选择器,同样,如果你不想为应用服务保存审计日志,可通过名称移除选择器,这就是为什么需要一个唯一的名称的原因(如果你想,可以使用简单的Linq在Selector里找到一个选择器,并移除它)。

注意:除了标准的审计配置,Mvc和Asp.net Core模块为Action定义了启用/禁用审计日志的配置。

 

通过特性启用/禁用

虽然你可以通过配置选择审计类,但你可以为一个单独的类、方法使用Audited和DisableAuditing特性,例如:


[Audited]
public class MyClass
{
    public void MyMethod1(int a)
    {
        //...
    }

    [DisableAuditing]
    public void MyMethod2(string b)
    {
        //...
    }

    public void MyMethod3(int a, int b)
    {
        //...
    }
}


 

除了MyMethod2,MyClass类的其它方法都被审计了,因为MyMethod2显式禁用了审计,Audited特性可用在一个方法上,只对关心的方法进行审计。

DisableAuditing可用在一个DTO的一个单独的属性上,因此,你可以在审计日志里隐藏敏感数据,例如密码。

 

注意

  • 为记录审计日志,方法必须是public,private和protected方法会被忽略。
  • 如果通过类引用调用一个方法,这个方法必须为virtual,如果类是通过它的接口被注入,那这就不是必要的(如通过注入IPersonService接口来使用PersonService类),ABP使用动态代理和拦截器,所以这又是必要的。这对于Mvc控制器的Action不适用,因为它们可能不为virtual。