1. 程式人生 > >ABP原始碼分析二十三:Authorization

ABP原始碼分析二十三:Authorization

Permission:用於定義一個Permission,一個permission可以包含多個子Permission.

PermissionDictionary:繼承自Dictionary<string, Permission>類,很明顯是一個用於儲存permission物件的字典。

IPermissionDefinitionContext/PermissionDefinitionContextBase: 這對介面和實現用於新建一個Permission到PermissionDictionary中,和根據permission name從PermissionDictionary返回一個permission.

IPermissionManager:該介面定義了一些返回permission的方法。

PermissionManager:在ABP這是一個單例例項,繼承了PermissionDefinitionContextBase類,實現了IPermissionManager的四個方法。 PermissionManager在Initialize方法中會例項化系統的Permissio並存入PermissionDictionary中。具體是通過呼叫AuthorizationProvider的SetPermissions的方法實現的。這邊的做法和FeatureManager通過FeatureProvider初始化FeatureDictionary一致,也和NavigationManager通過NavigationProvider初始化menus一致的。

PermissionManager的Initialize方法 是在AbpKernelModule的PostInitialize的方法中被呼叫的。

AuthorizationProvider: 功能類似於FeatureProvider。抽象基類,用於設定PermissionManager的PermissionDictionary。 Abp框架只提供了抽象類,下面程式碼是一個簡單的示例。實際專案中可以建立自定義AuthorizationProvider來從資料庫中讀取Permission資訊來填充到PermissionManager物件中。

IAuthorizationConfiguration

/AuthorizationConfiguration: PermissionManager通過具體的AuthorizationProvider來初始化PermissionDictionary。但是ABP核心模組處於最底層,怎麼能知道上層定義的AuthorizationProvider的型別呢? AuthorizationConfiguration為解決這個問題引入了AuthorizationProvider配置項。AuthorizationProvider就是一個Type 列表 (ITypeList<AuthorizationProvider>),注意是AuthorizationProvider的Type,不是例項。在需要AuthorizationProvider的地方,可以使用容器根據Type構造出例項。

IAbpAuthorizeAttribute/AbpAuthorizeAttribute: AbpAuthorize特性用於標註applicationService中只能被授權使用者使用的方法。

AuthorizationInterceptorRegistrar:用於將AuthorizationInterceptor攔截器註冊到所有實現IApplicationService的類的componentmodel中。

AuthorizationInterceptor:攔截器,攔截所有標註了AbpAuthorize特性的方法。

IPermissionDependencyContext/PermissionDependencyContext: 上下文類,作為方法的引數。沒有特別的業務邏輯。

IPermissionDependency:定義了一個用於check permission方法的介面。SimplePermissionDependency是其一個最簡單的實現。其可以用作為其他物件的一個屬性,以幫助其他物件得到檢查permission的能力。比如NotificationDefinition定義了一個IPermissionDependency型別的屬性。當ABP獲取某個使用者可見的Notification種類時,可以通過NotificationDefinitionIPermissionDependency型別的屬性去檢查使用者是否對該類Notification有接受許可權。

IPermissionChecker:定義了實際上用於完成permission check的方法,其實現一般都要訪問資料庫的。所以在ABP底層框架中只有一個其dummy的實現-NullPermissionChecker。

IAuthorizeAttributeHelper/AuthorizeAttributeHelper: 是對IPermissionChecker的更近一步的封裝同時提供了以AuthorizeAttribute為引數的校驗方法,以方便AuthorizationInterceptor的呼叫。

StaticPermissionChecker:用於從容器生成IPermissionChecker介面的實現,如果沒有自定義的IPermissionChecker實現被注入到容器中則返回NullPermissionChecker。這邊通過Lazy實現延遲載入。

接下來看看Abp.zero是如何注入IPermissionChecker

Abp.zero的原生框架定義了PermissionChecker的抽象類。

實際專案中則會定義如下繼承自PermissionChecker的抽象類的類

最後在MoudleInitialize中注入其到Abp底層框架的容器中去。

相關推薦

ABP原始碼分析十三Authorization

Permission:用於定義一個Permission,一個permission可以包含多個子Permission. PermissionDictionary:繼承自Dictionary<string, Permission>類,很明顯是一個用於儲存permission物件的字典。 I

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

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

ABP原始碼分析ApplicationService

IApplicationService : 空介面,起標識作用。所有實現了IApplicationService 的類都會被自動注入到容器中。同時所有IApplicationService物件都會被注入一些攔截器(例如:auditing, UnitOfWork等)以實現AOP AbpServiceBase:

ABP原始碼分析十三ABP.Web

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

ABP原始碼分析十六核心框架中的一些其他功能

本文是ABP核心專案原始碼分析的最後一篇,介紹一些前面遺漏的功能 AbpSession AbpSession: 目前這個和CLR的Session沒有什麼直接的聯絡。當然可以自定義的去實現IAbpSession使之與CLR的Session關聯 IAbpSession:定義如下圖中的四個屬性。 NullA

ABP原始碼分析十九ABP.MongoDb

這個Module通過建立一個MongoDbRepositoryBase<TEntity> 基類,封裝了對MongoDb資料庫的操作。 這個module通過引用MongoDB.Driver,MongoDB.Bson,MongoDB.Driver.Core,MongoDB.Driver.Legacy類

ABP原始碼分析十七ABP.Entity Framework

IRepository:介面定義了Repository常見的方法 AbpRepositoryBase:實現了IRepository介面的常見方法 EfRepositoryBase:實現了AbpRepositoryBase中定義的抽象方法:GetAll,Insert,Delete,Update。在實

ABP原始碼分析十五EventBus

IEventData/EventData: 封裝了EventData資訊,觸發event的源物件和時間 IEventBus/EventBus: 定義和實現了了一系列註冊,登出和觸發事件處理函式的方法。EventBus定義了一個Dictionary容器來存放事件和處理該事件的物件(其實不是物件而是Factor

ABP原始碼分析Navigation

MenuDefinition:封裝了導航欄上的主選單的屬性。 MenuItemDefinition:封裝了主選單的子選單的屬性。子選單可以引用其他子選單構成一個選單樹 UserMenu/UserMenuItem:封裝了用於顯示給使用者的選單/以及子選單集合。 ABP通過MenuDefinition/M

ABP原始碼分析十一Feature

Feature是什麼?Feature就是對function的分類方法,其與function的關係就比如Role和User的關係一樣。 ABP中Feature具有以下屬性: 其中最重要的屬性是name,用以表示feature的Identity,一個feature一個name. 一個Feature可以有一組子F

ABP原始碼分析ABP中配置的註冊和初始化

一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自Http

ABP原始碼分析十八ABP.MemoryDB

這個模組簡單,且無實際作用。一般實際專案中都有用資料庫做持久化,用了資料庫就無法用這個MemoryDB 模組了。原因在於ABP限制了UnitOfWork的型別只能有一個(前文以作介紹),一般用了資料庫的必然要注入efUnitOfWork. 而注入了efUnitOfWork就不能在注入MemoryDbUnitO

ABP原始碼分析十四Notification

NotificationDefinition: 用於封裝Notification Definnition 的資訊。注意和Notification 的區別,如果把Notification看成是具體的訊息內容,NotificationDefinition則是對這個訊息自身的定義(可理解為訊息的型別)。

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原始碼分析四十ZERO的Application和Tenant

ABP的Zero模組以資料庫為資料來源實現了ABP框架中的tenant management (multi-tenancy), role management, user management, session, authorization (permission management), setting m

ABP原始碼分析十九Auditing

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

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