AbpAuthorize屬性

https://aspnetboilerplate.com/Pages/Documents/Authorization
該AbpAuthorize(AbpMvcAuthorize爲MVC控制器和 AbpApiAuthorize的Web API控制器)屬性是檢查權限的最簡單,最常用的方法。考慮下面顯示的應用程序服務方法:

[AbpAuthorize("Administration.UserManagement.CreateUser")]
public void CreateUser(CreateUserInput input)
{
    //A user can not execute this method if he is not granted the "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.
}

AbpAuthorize屬性說明
ASP.NET Boilerplate使用動態方法攔截的強大功能進行授權。使用AbpAuthorize屬性的方法有一些限制。

它不能用於私有方法。
它不能用於靜態方法。
您不能將它用於非注入類的方法(我們必須使用 依賴注入)。
也:
如果通過接口調用方法(如通過接口使用的Application Services),則可以將其用於任何公共方法 。
如果方法直接從類引用(如ASP.NET MVC或Web API控制器)調用,則該方法應該是虛擬的。
如果方法受到保護,則該方法應該是虛擬的。
注意:有四種類型的授權屬性:

在應用程序服務(應用程序層)中,我們使用 Abp.Authorization.AbpAuthorize屬性。
在MVC控制器(Web層)中,我們使用 Abp.Web.Mvc.Authorization.AbpMvcAuthorize屬性。
在ASP.NET Web API中,我們使用 Abp.WebApi.Authorization.AbpApiAuthorize屬性。
在ASP.NET Core中,我們使用 Abp.AspNetCore.Mvc.Authorization.AbpMvcAuthorize屬性。
這種差異來自繼承。在應用程序層中,它完全是ASP.NET Boilerplate的實現,並且它不會擴展任何類。對於MVC和Web API,它繼承自這些框架的Authorize屬性。

禁止授權
您可以通過嚮應用程序服務添加AbpAllowAnonymous屬性來禁用方法/類的授權 。對MVC,Web API和ASP.NET核心控制器使用 AllowAnonymous屬性,這是這些框架的本機屬性。
使用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(它也有Async版本)。如果您只是檢查權限並拋出異常,如上所示,您可以使用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.
}

由於授權被廣泛使用,ApplicationService和一些公共基類注入並定義PermissionChecker屬性。因此,可以在不注入應用程序服務類的情況下使用權限檢查程序。

在Razor Views中
基本視圖類定義IsGranted方法以檢查當前用戶是否具有權限。因此,我們可以有條件地渲染視圖。例:

@if (IsGranted("Administration.UserManagement.CreateUser"))
{
    <button id="CreateNewUserButton" class="btn btn-primary"><i class="fa fa-plus"></i> @L("CreateNewUser")</button>
}

客戶端(JavaScript)
在客戶端,我們可以使用abp.auth命名空間中定義的API 。在大多數情況下,我們需要檢查當前用戶是否具有特定權限(具有權限名稱)。例:

abp.auth.isGranted('Administration.UserManagement.CreateUser');

您還可以使用abp.auth.grantedPermissions讓所有授予的權限或abp.auth.allPermissions獲得應用程序中所有可用的權限名。在運行時檢查其他人的abp.auth命名空間。

權限管理員
我們可能需要權限的定義。在這種情況下,可以 注入和使用IPermissionManager。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章