ABP框架学习之——授权(Authorization)

定义权限

一个唯一的权限是为需要授权的每个操作定义的。我们应该在使用权限之前定义一个权限。ABP的设计是模块化的,因此不同的模块可以有不同的权限。为了定义模块的权限,应该创建一个派生自AuthorizationProvider,通过abp官网创建的模板中包含这样一个例子:

    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有创建和获取权限的方法。一个权限定义了一些属性:
- Name:系统中 唯一的名字。最好为权限的名字定义一个const字符串而不是变量字符串。我们偏向使用“.”符号用于有层次的名字,但这不是强制的。你可以设置任何你喜欢的名字,唯一的一点是保证它必须是唯一的。
- DisplayName:用于以后在UI上显示权限的本地化字符串。
- Description:用于以后在UI上显示权限定义的本地化字符串。
- IsGrantedByDefault:表示该权限是否授予给所有登录的用户,除非该权限显式禁止未授予给用户。该值一般默认为false。
- MultiTenancySides:对于多租户应用,租户或者租主可以使用同一个权限。这是一个Flags枚举,因此一个权限可以用于租户和租主。
- dependedFeature:可以用于声明一个功能的依赖。因此,只有功能依赖满足了,该权限才会被授予。
一个权限可以有父权限和子权限。虽然这不会影响权限检查,但是在UI上组合权限有所帮助,下面是我自己添加了权限,进行了以下修改。

    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>
        /// 博客管理页面权限
        /// </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"));

当创建了授权提供者之后,我们应该在模块的PreIntialize方法中注册它:我们的模板中是这样注册的

    public class MZCApplicationModule : AbpModule
    {
        public override void PreInitialize()
        {
            Configuration.Authorization.Providers.Add<MZCAuthorizationProvider>();
        }
    }

使用AbpAuthorize特性验证权限

我们的模板中是这样使用的。

[AbpAuthorize(PermissionNames.Pages_Roles)]
    public class RoleAppService : AsyncCrudAppService<Role, RoleDto, int, PagedResultRequestDto, CreateRoleDto, RoleDto>, IRoleAppService
 {
}

AbpAuthorize特性需要注意的地方

  • ABP对于授权使用了强大的动态方法拦截(interception)。因此,使用AbpAuthorize特性有一些限制:
  • 不能用于私有方法。
  • 不能用于静态方法。
  • 不能用于非注入类的方法(我们必须要使用依赖注入)。

使用IPermissionChecker验证权限

虽然AbpAuthorize特性对于大多数情况相当够用了,但是肯定存在我们会在一个方法体内检查权限的情况。我们可以注入并使用IPermissionChecker。可以看见有两个方法提供使用。

    //
    // 摘要:
    //     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属性。这样,权限检查者不需要在应用服务类中注入就可以使用了。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值