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
IAbpAuthorizeAttribute/AbpAuthorizeAttribute: AbpAuthorize特性用於標註applicationService中只能被授權使用者使用的方法。
AuthorizationInterceptorRegistrar:用於將AuthorizationInterceptor攔截器註冊到所有實現IApplicationService的類的componentmodel中。
AuthorizationInterceptor:攔截器,攔截所有標註了AbpAuthorize特性的方法。
IPermissionDependencyContext/PermissionDependencyContext: 上下文類,作為方法的引數。沒有特別的業務邏輯。
IPermissionDependency:定義了一個用於check permission方法的介面。SimplePermissionDependency是其一個最簡單的實現。其可以用作為其他物件的一個屬性,以幫助其他物件得到檢查permission的能力。比如NotificationDefinition定義了一個IPermissionDependency型別的屬性。當ABP獲取某個使用者可見的Notification種類時,可以通過NotificationDefinition的IPermissionDependency型別的屬性去檢查使用者是否對該類Notification有接受許可權。
IPermissionChecker:定義了實際上用於完成permission check的方法,其實現一般都要訪問資料庫的。所以在ABP底層框架中只有一個其dummy的實現-NullPermissionChecker。
IAuthorizeAttributeHelper/AuthorizeAttributeHelper: 是對IPermissionChecker的更近一步的封裝同時提供了以AuthorizeAttribute為引數的校驗方法,以方便AuthorizationInterceptor的呼叫。
StaticPermissionChecker:用於從容器生成IPermissionChecker介面的實現,如果沒有自定義的IPermissionChecker實現被注入到容器中則返回NullPermissionChecker。這邊通過Lazy實現延遲載入。
接下來看看Abp.zero是如何注入IPermissionChecker。
Abp.zero的原生框架定義了PermissionChecker的抽象類。
實際專案中則會定義如下繼承自PermissionChecker的抽象類的類
最後在Moudle的Initialize中注入其到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