定義權(quán)限
一個(gè)唯一的權(quán)限是為需要授權(quán)的每個(gè)操作定義的撵割。我們應(yīng)該在使用權(quán)限之前定義一個(gè)權(quán)限贺喝。ABP的設(shè)計(jì)是模塊化的愚战,因此不同的模塊可以有不同的權(quán)限。為了定義模塊的權(quán)限氯檐,應(yīng)該創(chuàng)建一個(gè)派生自AuthorizationProvider戒良,通過abp官網(wǎng)創(chuàng)建的模板中包含這樣一個(gè)例子:
public static class PermissionNames
{
public const string Pages_Tenants = "Pages.Tenants";
public const string Pages_Users = "Pages.Users";
public const string Pages_Roles = "Pages.Roles";
}
public class MZCAuthorizationProvider : AuthorizationProvider
{
public override void SetPermissions(IPermissionDefinitionContext context)
{
context.CreatePermission(PermissionNames.Pages_Users, L("Users"));
context.CreatePermission(PermissionNames.Pages_Roles, L("Roles"));
context.CreatePermission(PermissionNames.Pages_Tenants, L("Tenants"), multiTenancySides: MultiTenancySides.Host);
}
private static ILocalizableString L(string name)
{
return new LocalizableString(name, MZCConsts.LocalizationSourceName);
}
}
IPermissionDefinitionContext有創(chuàng)建和獲取權(quán)限的方法。一個(gè)權(quán)限定義了一些屬性:
- Name:系統(tǒng)中 唯一的名字冠摄。最好為權(quán)限的名字定義一個(gè)const字符串而不是變量字符串糯崎。我們偏向使用“.”符號(hào)用于有層次的名字几缭,但這不是強(qiáng)制的。你可以設(shè)置任何你喜歡的名字拇颅,唯一的一點(diǎn)是保證它必須是唯一的奏司。
- DisplayName:用于以后在UI上顯示權(quán)限的本地化字符串。
- Description:用于以后在UI上顯示權(quán)限定義的本地化字符串樟插。
- IsGrantedByDefault:表示該權(quán)限是否授予給所有登錄的用戶韵洋,除非該權(quán)限顯式禁止未授予給用戶。該值一般默認(rèn)為false黄锤。
- MultiTenancySides:對(duì)于多租戶應(yīng)用搪缨,租戶或者租主可以使用同一個(gè)權(quán)限。這是一個(gè)Flags枚舉鸵熟,因此一個(gè)權(quán)限可以用于租戶和租主副编。
- dependedFeature:可以用于聲明一個(gè)功能的依賴。因此流强,只有功能依賴滿足了痹届,該權(quán)限才會(huì)被授予。
一個(gè)權(quán)限可以有父權(quán)限和子權(quán)限打月。雖然這不會(huì)影響權(quán)限檢查队腐,但是在UI上組合權(quán)限有所幫助,下面是我自己添加了權(quán)限,進(jìn)行了以下修改奏篙。
public static class PermissionNames
{
public const string Pages_Tenants = "Pages.Tenants";
public const string Pages_Users = "Pages.Users";
public const string Pages_Roles = "Pages.Roles";
/// <summary>
/// 博客管理頁面權(quán)限
/// </summary>
public const string Pages_Blogs = "Pages.Blogs";
public const string Pages_Blogs_Notes = "Pages.Blogs.Notes";
public const string Blogs_Notes_Edit = "Pages.Blogs.Notes.Edit";
public const string Blogs_Notes_Delete = "Pages.Blogs.Notes.Delete";
}
var BlogPermission = context.CreatePermission(PermissionNames.Pages_Blogs, L("Blogs"));
var NotePermission = BlogPermission.CreateChildPermission(PermissionNames.Pages_Blogs_Notes,L("Notes"));
NotePermission.CreateChildPermission(PermissionNames.Blogs_Notes_Edit, L("EditNotes"));
NotePermission.CreateChildPermission(PermissionNames.Blogs_Notes_Delete, L("DeleteNotes"));
當(dāng)創(chuàng)建了授權(quán)提供者之后柴淘,我們應(yīng)該在模塊的PreIntialize方法中注冊(cè)它:我們的模板中是這樣注冊(cè)的
public class MZCApplicationModule : AbpModule
{
public override void PreInitialize()
{
Configuration.Authorization.Providers.Add<MZCAuthorizationProvider>();
}
}
使用AbpAuthorize特性驗(yàn)證權(quán)限
我們的模板中是這樣使用的。
[AbpAuthorize(PermissionNames.Pages_Roles)]
public class RoleAppService : AsyncCrudAppService<Role, RoleDto, int, PagedResultRequestDto, CreateRoleDto, RoleDto>, IRoleAppService
{
}
AbpAuthorize特性需要注意的地方
- ABP對(duì)于授權(quán)使用了強(qiáng)大的動(dòng)態(tài)方法攔截(interception)秘通。因此为严,使用AbpAuthorize特性有一些限制:
- 不能用于私有方法。
- 不能用于靜態(tài)方法肺稀。
- 不能用于非注入類的方法(我們必須要使用依賴注入)第股。
使用IPermissionChecker驗(yàn)證權(quán)限
雖然AbpAuthorize特性對(duì)于大多數(shù)情況相當(dāng)夠用了,但是肯定存在我們會(huì)在一個(gè)方法體內(nèi)檢查權(quán)限的情況话原。我們可以注入并使用IPermissionChecker夕吻。可以看見有兩個(gè)方法提供使用稿静。
//
// 摘要:
// This class is used to permissions for users.
public interface IPermissionChecker
{
Task<bool> IsGrantedAsync(string permissionName);
Task<bool> IsGrantedAsync(UserIdentifier user, string permissionName);
}
在ApplicationService基類注入并定義了PermissionChecker屬性梭冠。這樣,權(quán)限檢查者不需要在應(yīng)用服務(wù)類中注入就可以使用了改备。