热线(9:00-18:00):13544706711
当前位置: 首页 > 教程技巧 > 

<<ABP文档>> 审计日志

时间: 2016/10/30 13:04:05

文档目录


 


本节内容:



 


简介


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


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。