ABP理論學習之審計日志
本篇目錄
介紹
維基百科說: “審計跟蹤(也叫審計日志)是與安全相關的按照時間順序的記錄,記錄集或者記錄源,它們提供了活動序列的文檔證據,這些活動序列可以在任何時間影響一個特定的操作,步驟或其他”。
ABP提供了一個基礎設施,它可以自動記錄所有和應用程序交互的日志。它可以記錄具有調用者信息和參數的方法調用。
一般地,要保存的字段是:相關的租戶Id,調用者的用戶Id,調用的 服務名稱(調用方法的類名),調用的方法名 , 執行方法名(序列化成Json) , 執行時間 , 執行時長(單位毫秒),客戶端IP地址 ,客戶端計算機名稱和異常(拋出異常的情況下)。
有了這些信息,我們不僅知道誰進行了該操作,而且可以測量應用的性能以及觀察拋出的異常。甚至,你可以獲得應用使用情況的統計數據(statistics)。
審計系統使用IAbpSession來獲得當前的UserId和TenantId。
關于 IAuditingStore
審計系統使用了IAuditingStore來存儲信息。雖然你可以用你自己的方式來實現該接口,但是它已經完全實現在module-zero項目中。如果你沒有實現該接口,那么默認會使用SimpleLogAuditingStore,并且它會將審計信息記錄到日志中(log)。
配置
要配置審計,可以在模塊的PreInitialize方法中使用Configuration.Auditing屬性。審計是默認開啟的。可以像下面那樣關閉它:
public class MyModule : AbpModule
{
public override void PreInitialize()
{
Configuration.Auditing.IsEnabled = false;
}
//...
}
這兒是審計配置屬性的列表:
- IsEnabled:用于完全開啟或關閉審計系統。默認為true。
- IsEnabledForAnonymousUsers:如果此值為true,那么沒有登錄到系統的用戶的審計日志也會保存。默認為false。
- MvcControllers:用于為ASP.NET MVC控制器配置審計。
- IsEnabled:用于為MVC控制器開啟或關閉審計。默認為true
- IsEnabledForChildActions:用于為子MVC action開啟或關閉審計。默認為false。
- Selectors:用于選擇其他的類保存審計日志。
可以看到,對于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顯式關閉了。審計特性可以用于想要參與審計的方法保存審計日志。
注意
- 為了保存審計日志,方法必須是public的。私有的和受保護的方法會被忽略。
- 如果方法是通過類的引用調用的,那么該方法必須是virtual的。因為ABP使用了動態代理和攔截,所以需要滿足該條件。如果使用了接口(比如注入IPersonService接口使用PersonService類)注入,就不必滿足“virtual”的條件了。對于MVC控制器的action不一定要滿足,它們可以不是“virtual”的。
我項目中的例子
下面的代碼是點擊登錄按鈕提交表單數據的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]去掉,再次登錄系統,可以看到有了審計記錄,截圖如下:

分別按序號解釋一下:
- 首次到達登錄頁面;
- 登錄成功,到達系統首頁Index;
- 去掉[DisableAuditing]特性后,到達登陸頁面;
- 將數據post提交到Login方法,記錄了審計日志,包含各種登錄參數;
- 登錄成功,返回系統首頁Index。
從我的例子可以很明顯地看出,默認情況下,ABP會自動記錄所有的控制器,除非你給它加上[DisableAuditing]特性,否則,始終會記錄審計日志。
已將所有贊助者統一放到單獨頁面!簽名處只保留最近10條贊助記錄!查看贊助者列表
| 衷心感謝打賞者的厚愛與支持!也感謝點贊和評論的園友的支持! | |||
|---|---|---|---|
| 打賞者 | 打賞金額 | 打賞日期 | |
| 微信:匿名 | 10.00 | 2017-08-03 | |
| 微信:匿名 | 10.00 | 2017-08-04 | |
| 微信:匿名 | 5.00 | 2017-06-15 | |
| 支付寶:一個名字499***@qq.com | 5.00 | 2017-06-14 | |
| 微信:匿名 | 16.00 | 2017-04-08 | |
| 支付寶:向京劉 | 10.00 | 2017-04-13 | |
| 微信:匿名 | 10.00 | 2017-003-08 | |
| 微信:匿名 | 5.00 | 2017-03-08 | |
| 支付寶:lll20001155 | 5.00 | 2017-03-03 | |
| 支付寶:她是一個弱女子 | 5.00 | 2017-03-02 | |

浙公網安備 33010602011771號