點這裏進入ABP系列文章總目錄html
ABP(現代ASP.NET樣板開發框架)系列之1八、ABP應用層——權限驗證git
ABP是「ASP.NET Boilerplate Project (ASP.NET樣板項目)」的簡稱。github
ABP的官方網站:http://www.aspnetboilerplate.comweb
ABP在Github上的開源項目:https://github.com/aspnetboilerplate架構
幾乎全部的企業級應用程序都會有不一樣級別的權限驗證。權限驗證是用於檢查用戶是否容許某些指定操做。Abp有基礎設施讓你來實現權限驗證。app
注意:關於IPermissionChecker接口框架
Abp權限系統使用IPermissionChecker去檢查受權。同時你能夠根據須要實現你本身的方式,在module-zero項目中已經完整實現了。若是IPermissionChecker沒有被實現,NullPermissionChecker會被使用於受權全部權限給每一個人。異步
在使用驗證權限前,咱們須要爲每個操做定義惟一的權限。Abp的設計是基於模塊化,因此不一樣的模塊能夠有不一樣的權限。爲了定義權限,一個模塊應該建立AuthorizationProvider的派生類。MyAuthorizationProvider繼承自AuthorizationProvider,換句話說就是AuthorizationProvider派生出MyAuthorizationProvider。例子以下:ide
public class MyAuthorizationProvider : AuthorizationProvider { public override void SetPermissions(IPermissionDefinitionContext context) { var administration = context.CreatePermission("Administration"); var userManagement = administration.CreateChildPermission("Administration.UserManagement"); userManagement.CreateChildPermission("Administration.UserManagement.CreateUser"); var roleManagement = administration.CreateChildPermission("Administration.RoleManagement"); } }
IPermissionDefinitionContext 有方法去獲取和建立權限。模塊化
一個權限有如下屬性:
Configuration.Authorization.Providers.Add<MyAuthorizationProvider>()
authorizationprovider會自動註冊到依賴注入系統中。所以,authorization provider能夠注入任何依賴(像是Repository)從而使用其餘資源去建立權限定義。
(1)使用AbpAuthorize特性(Using AbpAuthorize attribute)
AbpAuthorize(AbpMvcAuthorize 對應 MVC Controllers and AbpApiAuthorize 對應 Web API Controllers)特性是最簡單和經常使用的方法去檢查權限。請考慮以下application service方法:
[AbpAuthorize("Administration.UserManagement.CreateUser")] public void CreateUser(CreateUserInput input) { //A user can not execute this method if he is not granted for "Administration.UserManagement.CreateUser" permission. }
沒有得到「Administration.UserManagement.CreateUser」權限的用戶不可以調用CreateUser。
AbpAuthorize 特性也檢查當前用戶是否登陸 (使用 IAbpSession.UserId)。所以,若是咱們將某個方法聲明爲AbpAuthorize 特性,它至少會檢查用戶是否登陸。代碼以下: [AbpAuthorize]
public void SomeMethod(SomeMethodInput input) { //A user can not execute this method if he did not login. }
(2)AbpAuthorize屬性說明(AbpAuthorize attribute notes)
Abp使用動態方法攔截進行權限驗證。所以,使用AbpAuthorize特性的方法會有些限制。以下:
此外,
注意:有三種AbpAuthorize 特性:
這三個類繼承自不一樣的地方。
(3)使用IPermissionChecker
AbpAuthorize 適用於大部分的狀況,可是某些狀況下,咱們仍是須要本身在方法體裏進行權限驗證。咱們能夠注入和使用IPermissionChecker對象。以下邊的代碼所示:
public void CreateUser(CreateOrUpdateUserInput input) { if (!PermissionChecker.IsGranted("Administration.UserManagement.CreateUser")) { throw new AbpAuthorizationException("You are not authorized to create user!"); } //A user can not reach this point if he is not granted for "Administration.UserManagement.CreateUser" permission. }
固然,你能夠寫入任何邏輯,因爲IsGranted方法只是簡單返回true或false(它還有異步版本哦)。如你簡單的檢查一個權限並拋出一個異常如上邊代碼那樣,你能夠用Authorize方法:
public void CreateUser(CreateOrUpdateUserInput input) { PermissionChecker.Authorize("Administration.UserManagement.CreateUser"); //A user can not reach this point if he is not granted for "Administration.UserManagement.CreateUser" permission. }
因爲權限驗證一般實現與Application層,ApplicationService基礎類注入和定義了PermissionChecker屬性。所以,權限檢查器容許你在Application Service類使用,而不須要顯示注入。
但願更多國內的架構師能關注到ABP這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目能夠發展得更好。
歡迎加ABP架構設計交流QQ羣:134710707