本节内容:
简介
几乎所有的企业应用在某引起级别上使用授权。授权用来验证一个用户是否允许应用里的某些指定操作。
ABP 定义了一个基于许可的基础构架来实现授权。
关于 IPermissionChecker
授权系统使用 IPermissionChecker 来检查许可,虽然你用自己的方式实现它,不过在 module-zero 项目里已完全实现。如果没有实现该接口,会使用 NullPermissionChecker,它给每个人授予所有许可。
定义许可
为每个操作定义的唯一许可必须得到授权,为使用许可要先定义一个,ABP 是按设计的,所以不同的模块可以拥有不同的许可,一个模块为了定义它的许可,应当创建一个继承 AuthorizationProvider 的类。授权供应器示例如下:
- 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 拥有获取和创建许可的方法。
一个许可包含一些属性:
一个许可可以有一个父许可和多个子许可,虽然这对于许可检查没有什么作用,但可能有助于在 UI 上组织许可。
创建一个授权供应器之后,我们应当在我们模块的预初始化方法里注册它:
- Configuration.Authorization.Providers.Add();
授权供应器被自动注册到里,所以一个授权供应器可以注入任何的依赖(如一个仓储),从而可以使用其它的源来定义许可。
检查许可
使用 AbpAuthorize 特性
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 for "Administration.UserManagement.CreateUser" permission.
- }
CreateUser 方法不能被没有 "Administration.UserManagement.CreateUser" 许可的用户调用。
AbpAuthorize 特性也检查当前用户是否已登录(使用),所以,如果我们为一个方法声明一个 AbpAuthorize,它只用来检查用户是否已登录:
- [AbpAuthorize] public void SomeMethod(SomeMethodInput input) { //用户如果未登录,不能执行这个方法
- }
AbpAuthorize 特性注意事项
ABP 为授权使用强大的动态方法拦截,所以对于使用 AbpAuthorize 特性的方法有些限制:
同时,可用于:
注意:有 4 类授权特性:
这些不同来自于继承,在应用层里,ABP 完整地实现了,也没有扩展任何类,但是在 Mvc 和 Web Api 里,它从自身框架的 Authorize 特性继承。
废止授权
我们可以为应用服务添加 AbpAllowAnonymous 特性来禁用一个方法 / 类的授权,使用框架自身的 AllowAnonymous 特性来禁用 Mvc、Web Api、Asp.net Core 控制器的授权。
使用 IPermissionChecker
尽管 AbpAuthorize 特性能完美应对大部分情况,但有些情况我们必须要在方法内检查一个许可,这时我们可以注入并使用 IPermissionChecker,如下所示:
- public void CreateUser(CreateOrUpdateUserInput input) {
- if (!PermissionChecker.IsGranted("Administration.UserManagement.CreateUser")) {
- throw new AbpAuthorizationException("You are not authorized to create user!");
- }
- //一个用户如果没有经过"Administration.usermanagerment.CreateUser"许可的允许,是不可以到达这里的。
- }
尽管 IsGranted 只是简单的返回 true 或 false,但你也可以编写任何逻辑(IsGranted 也有异步版本)。如果你像上面那样,只是简单的检查一个许可并抛出一个异常,你可以使用 Authorize 方法:
- public void CreateUser(CreateOrUpdateUserInput input) {
- PermissionChecker.Authorize("Administration.UserManagement.CreateUser");
- //一个用户如果没有经过"Administration.usermanagerment.CreateUser"许可的允许,是不可以到达这里的。
- }
由于授权的广泛使用,ApplicationService 和一些通用的基类注入并定义了 PermissionChecker 属性,因此,在应用服务类里,不需要注入就可以使用许可检查器。
在 Razor 视图里
基视图类已经定义了 IsGranted 方法来检查当前用户是否有许可证,因此,我们可以有条件的渲染视图,例如:
- @
- if (IsGranted("Administration.UserManagement.CreateUser")) {
- "CreateNewUserButton"class = "btn btn-primary" > class = "fa fa-plus" > @L("CreateNewUser")
- }
客户端(Javascript)
在客户端里,我们可以使用定义在 abp.auth 命名空间里的 API,大部分情况下,我们需要检查当前用户是否有一个指定的许可(使用许可名称),例如:
- abp.auth.isGranted('Administration.UserManagement.CreateUser');
你也可以使用 abp.auth.grantedPermissions 获取所有授予权限或 abp.auth.allPerssions 获取所有可用的许可名称。在运行时里查看 abp.auth 命名空间的其它 API。
许可管理器
我们可能会用到许可的定义,这里可以并使用 IPermissionManager。
来源: http://www.cnblogs.com/kid1412/p/6006297.html