维基百科说: “审计跟踪(也叫审计日志)是与安全相关的按照时间顺序的记录,记录集或者记录源,它们提供了活动序列的文档证据,这些活动序列可以在任何时间影响一个特定的操作,步骤或其他”。
ABP提供了一个基础设施,它可以自动记录所有和应用程序交互的日志。它可以记录具有调用者信息和参数的方法调用。
一般地,要保存的字段是:相关的 租户Id ,调用者的 用户Id ,调用的 服务名称 (调用方法的类名),调用的 方法名 , 执行 方法名 (序列化成Json) , 执行时间 , 执行 时长 (单位毫秒),客户端 IP地址 ,客户端 计算机名称 和 异常 (抛出异常的情况下)。
有了这些信息,我们不仅知道谁进行了该操作,而且可以测量应用的 性能 以及观察抛出的异常。甚至,你可以获得应用使用情况的 统计数据(statistics) 。
审计系统使用 IAbpSession 来获得当前的UserId和TenantId。
审计系统使用了IAuditingStore来存储信息。虽然你可以用你自己的方式来实现该接口,但是它已经完全实现在 module-zero 项目中。如果你没有实现该接口,那么默认会使用SimpleLogAuditingStore,并且它会将审计信息记录到日志中(log)。
要配置审计,可以在模块的PreInitialize方法中使用 Configuration.Auditing 属性。审计是 默认开启的 。可以像下面那样关闭它:
public class MyModule : AbpModule { public override void PreInitialize() { Configuration.Auditing.IsEnabled = false; } //... }
这儿是审计配置属性的列表:
可以看到,对于MVC控制器的审计是单独配置的,因为它用到了不同的技术。
Selectors是选择其他的类型来保存审计日志的谓词列表。一个选择器有一个唯一的名字和一个谓词。这个列表中唯一的默认选择器用于选择 应用服务类 。它是如下定义的:
Configuration.Auditing.Selectors.Add( new NamedTypeSelector( "Abp.ApplicationServices", type => typeof (IApplicationService).IsAssignableFrom(type) ) );
你可以将你的选择器添加到模块的PreInitialize方法中。而且,如果你不喜欢为应用服务保存审计日志,那么你可以通过名称移除选择器。那就是为什么要有一个唯一名称的原因(使用简单的linq找出该选择器,然后可以移除它)。
虽然可以通过配置选择审计类,但是也可以为一个单独的类或方法使用 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显式关闭了。审计特性可以用于想要参与审计的方法保存审计日志。
下面的代码是点击登录按钮提交表单数据的action方法:
[HttpPost] [UnitOfWork] [DisableAuditing] public virtual async Task<JsonResult> Login(LoginViewModel loginModel, string returnUrl = "") { CheckModelState(); _unitOfWorkManager.Current.DisableFilter(AbpDataFilters.MayHaveTenant); var loginResult = await GetLoginResultAsync( loginModel.UsernameOrEmailAddress, loginModel.Password, loginModel.TenancyName ); await SignInAsync(loginResult.User, loginResult.Identity, loginModel.RememberMe); if (string.IsNullOrWhiteSpace(returnUrl)) { returnUrl = Request.ApplicationPath; } return Json(new MvcAjaxResponse { TargetUrl = returnUrl }); }
下面的截图是数据库中的审计日志信息,大家可以看到今天还没有数据,最晚的数据是2015-12-18的数据:
登录系统之后,依然没有记录审计日志,下面统一截图。
下面我将上面的代码的特性 [DisableAuditing] 去掉,再次登录系统,可以看到有了审计记录,截图如下:
分别按序号解释一下:
从我的例子可以很明显地看出,默认情况下,ABP会自动记录所有的控制器,除非你给它加上 [DisableAuditing] 特性,否则,始终会记录审计日志。