【转】ABP源码分析十九:Auditing
審計(jì)跟蹤(也叫審計(jì)日志)是與安全相關(guān)的按照時(shí)間順序的記錄,它們提供了活動(dòng)序列的文檔證據(jù),這些活動(dòng)序列可以在任何時(shí)間影響一個(gè)特定的操作。
?
AuditInfo:定義如下圖中需要被Audit的信息。
?
AuditedAttribute: 用于標(biāo)識(shí)一個(gè)方法或一個(gè)類的所有方法都需要啟用Auditing功能。
DisableAuditingAttribute:用于標(biāo)識(shí)一個(gè)方法或一個(gè)類的所有方法都需要關(guān)閉Auditing功能。
?
IMvcControllersAuditingConfiguration/MvcControllersAuditingConfiguration?: 用于配置是否啟用對(duì)MVC Controller及其Action的Auditing功能。
?
IAuditingConfiguration/AuditingConfiguration: 可以配置如下圖中的四個(gè)屬性,除了Selectors外其他三個(gè)屬性都很容易理解。
?
NamedTypeSelector:類型選擇器,這個(gè)對(duì)象的核心屬性是一個(gè)以type為輸入?yún)?shù),返回bool類型的委托predicate.
?
IAuditingSelectorList/AuditingSelectorList?:?這是一個(gè)NamedTypeSelector對(duì)象的集合
?
如下是AbpKernelModule在PreInitialize方法中給IAuditingConfiguration對(duì)象配置了一個(gè)類型選擇器(用于篩選出IApplicationService對(duì)象),稍后所有IApplicationService對(duì)象都會(huì)被注入Auditing 攔截器。
?
IAuditInfoProvider:這個(gè)接口定義一個(gè)方法用于完善AuditInfo對(duì)象。為什么要定義一個(gè)這樣的接口和方法呢?ABP核心模塊處于最底層,有些上層的信息在這一層無法直接取得(比如瀏覽器信息)。ABP的做法是在上層實(shí)現(xiàn)IAuditInfoProvider,然后將其register到底層的容器中。處于底層ABP的核心模塊則從resolve出這個(gè)對(duì)象,然后調(diào)用該對(duì)象的fill方法來完善AuditInfo。
?
NullAuditInfoProvider?: 空的IAuditInfoProvider實(shí)現(xiàn),這個(gè)是ABP中的缺省的IAuditInfoProvider的實(shí)現(xiàn)。
WebAuditInfoProvider?:這個(gè)IAuditInfoProvider對(duì)象就是上面所說的上層的IAuditInfoProvider實(shí)現(xiàn)。這個(gè)類就是在Abp.Web模塊中實(shí)現(xiàn)的。(注意:整個(gè)項(xiàng)目中除了NullAuditInfoProvider 只能有一個(gè)自定義的IAuditInfoProvider實(shí)現(xiàn)。也就是說實(shí)際項(xiàng)目中無法直接創(chuàng)建自定義的IAuditInfoProvider,因?yàn)锳bp.Web模塊中已經(jīng)有一個(gè)了。)
?
?
ABP是如何實(shí)現(xiàn)在方法執(zhí)行時(shí)自動(dòng)完成Auditing的呢(俗話叫AOP)?通過注入到IApplicationService對(duì)象的componentmodel上的AuditingInterceptor攔截器實(shí)現(xiàn)的。AuditingInterceptor攔截器是由AuditingInterceptorRegistrar對(duì)象的Initialize方法注入的。而AuditingInterceptorRegistrar的Initialize會(huì)在AbpKernelModule的Initialize的時(shí)候被調(diào)用。(見下面代碼截圖)
?
?
?
滿足以下四個(gè)條件的方法都會(huì)被AuditingInterceptor攔截:
1.IApplicationService的實(shí)例中的方法
2.添加了AuditedAttribute的類的實(shí)例的方法
3.加了AuditedAttribute的方法
4.通過IAuditingConfiguration對(duì)象的Selectors屬性添加需要被auditing的類型。
?
那些方法會(huì)執(zhí)行的時(shí)候會(huì)被真正加入Auditing功能呢?具體可參見AuditingHelper的代碼。大概總結(jié)如下條件(同時(shí)滿足):
1.必須滿足AuditingConfiguration中的IsEnabled為true
2.如果session為空,則configuration.IsEnabledForAnonymousUsers也必須為true
3.Public 方法
?
AuditingInterceptor生成AuditInfo實(shí)例,然后調(diào)用IAuditingStore類實(shí)例執(zhí)行AuditInfo持久化。
IAuditingStore:這個(gè)接口定義持久化AuditInfo的方法
SimpleLogAuditingStore:ABP底層框架自帶的IAuditingStore實(shí)現(xiàn)是SimpleLogAuditingStore,可以把下圖中5個(gè)信息持久化到日志中。module-zero項(xiàng)目中有個(gè)更為完整的實(shí)現(xiàn)。
?
實(shí)現(xiàn)Auditing功能的相關(guān)接口和對(duì)象的關(guān)系圖
?
?
返回ABP源碼分析系列文章目錄
總結(jié)
以上是生活随笔為你收集整理的【转】ABP源码分析十九:Auditing的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 技能人才歧视要改变!姚劲波:很多保姆月嫂
- 下一篇: 【转】极限编程一览