ABP(現代ASP.NET樣板開發框架)系列之1八、ABP應用層——權限驗證

點這裏進入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 有方法去獲取和建立權限。模塊化

一個權限有如下屬性:

  • Name:系統範圍內的惟一名字。把它定義爲一個字符串常量是個不錯的注意。咱們傾向於將「.」分割不一樣的層級,但並不要求這麼作。你能夠設置你任何喜歡的名字。惟一的規則就是這個名字必須是惟一的。
  • Display Name:使用一個本地化的字符串去顯示權限到UI。
  • Description:和Display Name相似。
  • IsGrantedByDefault:此權限是否受權給(已登錄)全部用戶,除非顯示指定。一般設置爲False(默認值)。
  • MultiTenancySides:對租戶應用程序,一個權限能夠基於租戶或者主機(原文:host)。這是個枚舉標識,所以權限能夠應用於不一樣方面(原文:Both Sides)。
  • 一個權限能夠有父權限和子權限。固然,這不會影響權限檢查,它只是在UI層對權限歸類有好處。建立authorizationprovider以後,咱們應該在模塊的PreIntialize方法對它進行註冊。以下:
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特性的方法會有些限制。以下:

  • 不能應用於私有(private)方法
  • 不能應用於靜態(static)方法
  • 不能應用於非注入(non-injected)類(咱們必須用依賴注入)。

此外,

  • AbpAuthorize特性能夠應用於任何的Public方法,若是此方法被接口調用(好比在Application Services中經過接口調用)
  • 方法是虛(virtual)方法,若是此方法直接被類引用進行調用(像是ASP.NET MVC 或 Web API 的控制器)。
  • 方式是虛(virtual)方法,若是此方法是protected。

注意:有三種AbpAuthorize 特性:

  • 在應用程序服務中(application layer),咱們使用Abp.Authorization.AbpAuthorize;
  • 在MVC控制器(web layer)中,咱們使用Abp.Web.Mvc.Authorization.AbpMvcAuthorize;
  • 在ASP.NET Web API,咱們使用 Abp.WebApi.Authorization.AbpApiAuthorize。

這三個類繼承自不一樣的地方。

  • 在MVC中,它繼承自MVC本身的Authorize類。
  • 在Web API,它繼承自Web API 的Authorize類。所以,它最好是繼承到MVC和Web API中。
  • 可是,在Application 層,它徹底是由Abp本身實現沒有擴展子任何類。

(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

ABP架構設計交流羣

 

點這裏進入ABP系列文章總目錄

相關文章
相關標籤/搜索