审计日志
维基百科: "审计跟踪(也称为审计日志)是一种安全相关的按时间顺序记录,记录集或记录目的和来源. 这种记录提供了在任何特定时间的操作,过程或事件产生影响活动顺序的文件证据 ".
ABP框架提供一个可扩展的审计日志系统,自动化的根据约定记录审计日志,并提供配置控制审计日志的级别.
一个审计日志对象(参见下面的审计日志对象部分)通常是针对每个web请求创建和保存的.包括;
- 请求和响应的细节 (如URL,HTTP方法,浏览器信息,HTTP状态代码...等).
- 执行的动作 (控制器操作和应用服务方法调用及其参数).
- 实体的变化 (在Web请求中).
- 异常信息 (如果在执行请求发生操作).
- 请求时长 (测量应用程序的性能).
使用 [TypeFilter(typeof(CMSAuditActionFilter))] 在控制器上
在CMS系统中,我们使用 [TypeFilter(typeof(CMSAuditActionFilter))]
属性来为控制器启用审计日志功能。这个过滤器应该被添加到需要审计的控制器上,用于创建和保存审计日志。
AbpAuditingOptions
AbpAuditingOptions
是配置审计日志系统的主要配置选项:
Configure<AbpAuditingOptions>(options =>
{
options.IsEnabled = false; //Disables the auditing system
});
这里是你可以配置的选项列表:
IsEnabled
(默认值:true
): 启用或禁用审计系统的总开关. 如果值为false
,则不使用其他选项.HideErrors
(默认值:true
): 在保存审计日志对象时如果发生任何错误,审计日志系统会将错误隐藏并写入常规日志. 如果保存审计日志对系统非常重要那么将其设置为false
以便在隐藏错误时抛出异常.IsEnabledForAnonymousUsers
(默认值:true
): 如果只想为经过身份验证的用户记录审计日志,请设置为false
.如果为匿名用户保存审计日志,你将看到这些用户的UserId
值为null
.AlwaysLogOnException
(默认值:true
): 如果设置为true
,将始终在异常/错误情况下保存审计日志,不检查其他选项(IsEnabled
除外,它完全禁用了审计日志).IsEnabledForGetRequests
(默认值:false
): HTTP GET请求通常不应该在数据库进行任何更改,审计日志系统不会为GET请求保存审计日志对象. 将此值设置为true
可为GET请求启用审计日志系统.ApplicationName
: 如果有多个应用程序保存审计日志到单一的数据库,使用此属性设置为你的应用程序名称区分不同的应用程序日志.IgnoredTypes
: 审计日志系统忽略的Type
列表. 如果它是实体类型,则不会保存此类型实体的更改. 在序列化操作参数时也使用此列表.EntityHistorySelectors
:选择器列表,用于确定是否选择了用于保存实体更改的实体类型. 有关详细信息请参阅下面的部分.Contributors
:AuditLogContributor
实现的列表. 贡献者是扩展审计日志系统的一种方式. 有关详细信息请参阅下面的"审计日志贡献者"部分.
实体历史选择器
保存你的所有实体的所有变化将需要大量的数据库空间. 出于这个原因审计日志系统不保存为实体的任何改变,除非你明确地对其进行配置.
要保存的所有实体的所有更改,只需使用 AddAllEntities()
扩 展方法.
Configure<AbpAuditingOptions>(options =>
{
options.EntityHistorySelectors.AddAllEntities();
});
options.EntityHistorySelectors
实际上是一个类型谓词的列表,你可以写一个lambda表达式定义过滤器.
下面的示例中与使用 AddAllEntities()
扩展方法效果相同:
Configure<AbpAuditingOptions>(options =>
{
options.EntityHistorySelectors.Add(
new NamedTypeSelector(
"MySelectorName",
type =>
{
if (typeof(IEntity).IsAssignableFrom(type))
{
return true;
}
else
{
return false;
}
}
)
);
});
条件 typeof(IEntity).IsAssignableFrom(type)
对于任何实现 IEntity
接口的类(从技术上来这些都是你应用程序中的实体) 结果都为 true
. 你可以根据自己的逻辑编写条件并返回 true
或 false
.
options.EntityHistorySelectors
是一种灵活动态的选择实体进行审计日志记录的方法. 另一种方法是为每个实体使用 Audited
和 DisableAuditing
attribute.
启用/禁用审计日志服务
启用/禁用 Controllers & Actions
默认所有的控制器动作都会被记录下来(有关GET请求,请参阅上面的 IsEnabledForGetRequests
).
你可以使用 [DisableAuditing]
来禁用 特定的控制器:
[DisableAuditing]
public class HomeController : AbpController
{
//...
}
使用 [DisableAuditing]
在action级别控制:
public class HomeController : AbpController
{
[DisableAuditing]
public async Task<ActionResult> Home()
{
//...
}
public async Task<ActionResult> OtherActionLogged()
{
//...
}
}