1. 程式人生 > >ABP原始碼分析十九:Auditing

ABP原始碼分析十九:Auditing

審計跟蹤(也叫審計日誌)是與安全相關的按照時間順序的記錄,它們提供了活動序列的文件證據,這些活動序列可以在任何時間影響一個特定的操作。

AuditInfo:定義如下圖中需要被Audit的資訊。

AuditedAttribute: 用於標識一個方法或一個類的所有方法都需要啟用Auditing功能。

DisableAuditingAttribute:用於標識一個方法或一個類的所有方法都需要關閉Auditing功能。

IMvcControllersAuditingConfiguration/MvcControllersAuditingConfiguration : 用於配置是否啟用對MVC Controller及其Action的Auditing功能。

IAuditingConfiguration/AuditingConfiguration: 可以配置如下圖中的四個屬性,除了Selectors外其他三個屬性都很容易理解。

NamedTypeSelector:型別選擇器,這個物件的核心屬性是一個以type為輸入引數,返回bool型別的委託predicate.

IAuditingSelectorList/AuditingSelectorList : 這是一個NamedTypeSelector物件的集合

如下是AbpKernelModule在PreInitialize方法中給IAuditingConfiguration物件配置了一個型別選擇器(用於篩選出IApplicationService物件),稍後所有IApplicationService物件都會被注入Auditing 攔截器。

IAuditInfoProvider:這個介面定義一個方法用於完善AuditInfo物件。為什麼要定義一個這樣的介面和方法呢?ABP核心模組處於最底層,有些上層的資訊在這一層無法直接取得(比如瀏覽器資訊)。ABP的做法是在上層實現IAuditInfoProvider,然後將其register到底層的容器中。處於底層ABP的核心模組則從resolve出這個物件,然後呼叫該物件的fill方法來完善AuditInfo。

NullAuditInfoProvider : 空的IAuditInfoProvider實現,這個是ABP中的預設的IAuditInfoProvider的實現。

WebAuditInfoProvider

:這個IAuditInfoProvider物件就是上面所說的上層的IAuditInfoProvider實現。這個類就是在Abp.Web模組中實現的。(注意:整個專案中除了NullAuditInfoProvider 只能有一個自定義的IAuditInfoProvider實現。也就是說實際專案中無法直接建立自定義的IAuditInfoProvider,因為Abp.Web模組中已經有一個了。

ABP是如何實現在方法執行時自動完成Auditing的呢(俗話叫AOP)?通過注入到IApplicationService物件的componentmodel上的AuditingInterceptor攔截器實現的。AuditingInterceptor攔截器是由AuditingInterceptorRegistrar物件的Initialize方法注入的。而AuditingInterceptorRegistrar的Initialize會在AbpKernelModule的Initialize的時候被呼叫。(見下面程式碼截圖)

滿足以下四個條件的方法都會被AuditingInterceptor攔截:

1.IApplicationService的例項中的方法

2.添加了AuditedAttribute的類的例項的方法

3.加了AuditedAttribute的方法

4.通過IAuditingConfiguration物件的Selectors屬性新增需要被auditing的型別。

那些方法會執行的時候會被真正加入Auditing功能呢?具體可參見AuditingHelper的程式碼。大概總結如下條件(同時滿足):

1.必須滿足AuditingConfiguration中的IsEnabled為true

2.如果session為空,則configuration.IsEnabledForAnonymousUsers也必須為true

3.Public 方法

AuditingInterceptor生成AuditInfo例項,然後呼叫IAuditingStore類例項執行AuditInfo持久化。

IAuditingStore:這個介面定義持久化AuditInfo的方法

SimpleLogAuditingStore:ABP底層框架自帶的IAuditingStore實現是SimpleLogAuditingStore,可以把下圖中5個資訊持久化到日誌中。module-zero專案中有個更為完整的實現。

實現Auditing功能的相關介面和物件的關係圖

相關推薦

ABP原始碼分析Auditing

審計跟蹤(也叫審計日誌)是與安全相關的按照時間順序的記錄,它們提供了活動序列的文件證據,這些活動序列可以在任何時間影響一個特定的操作。 AuditInfo:定義如下圖中需要被Audit的資訊。 AuditedAttribute: 用於標識一個方法或一個類的所有方法都需要啟用Auditing功能

ABP原始碼分析Entity的設計

IEntity<TPrimaryKey>: 封裝了PrimaryKey:Id,這是一個泛型型別 IEntity: 封裝了PrimaryKey:Id,這是一個int型別 Entity<TPrimaryKey> :支援主鍵是泛型型別的Entity Entity:支援主鍵是int型別的

ABP原始碼分析DTO的設計

IDTO:空介面,用於標註Dto物件。 ComboboxItemDto:用於combobox/list中Item的DTO NameValueDto<T>/NameValueDto:用於name value鍵值對的DTO, name為string型別, value為泛型或string型別。

ABP原始碼分析DTO 自動校驗的實現

對傳給Application service物件中的方法的DTO引數,ABP都會在方法真正執行前自動完成validation(根據標註到DTO物件中的validate規則)。 ABP是如何做到的? 思路無外乎通過Castle的攔截器實現AOP。本文主要分析ABP是如何設計。 Ivalidate: 空介面,用

ABP原始碼分析本地化

本文逐個分析ABP中涉及到locaization的介面和類,以及相互之間的關係。本地化主要涉及兩個方面:一個是語言(Language)的管理,這部分相對簡單。另一個是語言對應得本地化資源(Localization)的管理,這部分稍顯複雜。 LanguageInfo:用於封裝language的基本

ABP原始碼分析Timing

Timing這個簡單實用的功能主要用於以統一的方式表示時間。因為ABP中有大量的module,還支援自定義module,所以將時間統一表示為local時間(預設)或utc時間是必要的。 IClockProvider:提供獲取當前時間和標準化時間的介面。 UtcClockProvider:實現了以UTC

ABP原始碼分析UI Inputs

以下圖中描述的介面和類都在Abp專案的Runtime/Validation, UI/Inputs目錄下的。在當前版本的ABP(0.83)中這些介面和類並沒有實際使用到。閱讀程式碼時可以忽略,無需浪費時間去尋找其是如何被ABP使用的(本文的目的)。 這些介面和類最終都是通過IInputType被Feature

ABP原始碼分析Unit Of Work

ABP以AOP的方式實現UnitOfWork功能。通過UnitOfWorkRegistrar將UnitOfWorkInterceptor在某個類被註冊到IOCContainner的時候,一併新增到該類在容器中對應的ComponentModel的Interceptors集合中。總結一句話就是,UOW的功能是通過

[Abp 原始碼分析]四、DTO 自動驗證

0.簡介 在平時開發 API 介面的時候需要對前端傳入的引數進行校驗之後才能進入業務邏輯進行處理,否則一旦前端傳入一些非法/無效資料到 API 當中,輕則導致程式報錯,重則導致整個業務流程出現問題。 用過傳統 ASP.NET MVC 資料註解的同學應該知道,我們可以通過在 Model 上面指定各種資料特性,然

[Abp 原始碼分析]五、自動審計記錄

0.簡介 Abp 框架為我們自帶了審計日誌功能,審計日誌可以方便地檢視每次請求介面所耗的時間,能夠幫助我們快速定位到某些效能有問題的介面。除此之外,審計日誌資訊還包含有每次呼叫介面時客戶端請求的引數資訊,客戶端的 IP 與客戶端使用的瀏覽器。有了這些資料之後,我們就可以很方便地復現介面產生 BUG 時的一些環

[Abp 原始碼分析]六、後臺作業與後臺工作者

0. 簡介 在某些時候我們可能會需要執行後臺任務,或者是執行一些週期性的任務。比如說可能每隔 1 個小時要清除某個臨時資料夾內的資料,可能使用者會要針對某一個使用者群來群發一組簡訊。前面這些就是典型的應用場景,在 Abp 框架裡面為我們準備了後臺作業和後臺工作者來幫助我們解決這個問題。 後臺作業與後臺工作者的

[Abp 原始碼分析]七、ASP.NET Core 整合

0. 簡介 整個 Abp 框架最為核心的除了 Abp 庫之外,其次就是 Abp.AspNetCore 庫了。雖然 Abp 本身是可以用於控制檯程式的,不過那樣的話 Abp 就基本沒什麼用,還是需要集合 ASP.NET Core 才能發揮它真正的作用。 在 Abp.AspNetCore 庫裡面,Abp 通過 W

[Abp 原始碼分析]一、許可權驗證

0.簡介 Abp 本身集成了一套許可權驗證體系,通過 ASP.NET Core 的過濾器與 Castle 的攔截器進行攔截請求,並進行許可權驗證。在 Abp 框架內部,許可權分為兩塊,一個是功能(Feature),一個是許可權項(Permission),在更多的時候兩者僅僅是概念不同而已,大體處理流程還是一樣

[Abp 原始碼分析]、異常處理

0.簡介 Abp 框架本身針對內部丟擲異常進行了統一攔截,並且針對不同的異常也會採取不同的處理策略。在 Abp 當中主要提供了以下幾種異常型別: 異常型別 描述 AbpException Abp 框架定義的基本異常型別,Abp 所有內部定義的異常型別都繼承自本類。 AbpInitializa

Spring Security原始碼分析Spring Security OAuth2整合JWT

Json web token (JWT), 是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準(RFC 7519).該token被設計為緊湊且安全的,特別適用於分散式站點的單點登入(SSO)場景。JWT的宣告一般被用來在身份提供者和服務提供者

Spring Security原始碼分析Spring Security專案實戰

Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Contr

Spring Security原始碼分析Spring Security 頁面許可權控制

Spring Security是一個能夠為基於Spring的企業應用系統提供宣告式的安全訪問控制解決方案的安全框架。它提供了一組可以在Spring應用上下文中配置的Bean,充分利用了Spring IoC,DI(控制反轉Inversion of Contr

LevelDB原始碼分析env

考慮到移植以及靈活性,LevelDB將系統相關的處理(檔案/程序/時間)抽象成Evn,使用者可以自己實現相應的介面,作為option的一部分傳入,預設使用自帶的實現。  env.h中聲明瞭: 虛基類env,在env_posix.cc中,派生類PosixEnv繼承自env

ABP原始碼分析四十三ZERO的本地化

ABP Zero模組擴充套件了ABP基礎框架中的本地化功能,實現了通過資料庫管理本地化的功能。其通過資料庫儲存本地化語言及其資源。 ApplicationLanguage:代表本地化語言的實體類。一種語言就是一個ApplicationLanguage例項。 ApplicationLanguag

ABP原始碼分析三十三ABP.Web

ABP.Web模組並不複雜,主要完成ABP系統的初始化和一些基礎功能的實現。 AbpWebApplication : 繼承自ASP.Net的HttpApplication類,主要完成下面三件事一,在Application_Start完成AbpBootstrapper的初始化。整個ABP系統的初始化就是通過A