1、.Core -> Authorization -> PermissionNames.cs 这里新增权限项,可以具体到按钮(即方法名)
2、.Core 》 Authorization 》
context.CreatePermission(PermissionNames.Pages_Users_ChangeOnline, L("ChangeOnline"));
IPermissionDefinitionContext有创建和获取权限的方法。一个权限定义了一些属性:
- Name:系统中 唯一的名字。最好为权限的名字定义一个const字符串而不是变量字符串。我们偏向使用“.”符号用于有层次的名字,但这不是强制的。你可以设置任何你喜欢的名字,唯一的一点是保证它必须是唯一的。
- DisplayName:用于以后在UI上显示权限的本地化字符串。
- Description:用于以后在UI上显示权限定义的本地化字符串。
- IsGrantedByDefault:表示该权限是否授予给所有登录的用户,除非该权限显式禁止未授予给用户。该值一般默认为false。
- MultiTenancySides:对于多租户应用,租户或者租主可以使用同一个权限。这是一个Flags枚举,因此一个权限可以用于租户和租主。
- dependedFeature:可以用于声明一个功能的依赖。因此,只有功能依赖满足了,该权限才会被授予。
3、具体方法的权限控制
3.1、方法上,加上[AbpAuthorize(PermissionNames.Pages_Users_ChangeOnline)]
3.2、类上加, [AbpAuthorize(PermissionNames.Pages_Users)]
AbpAuthorize特性需要注意的地方:
ABP对于授权使用了强大的动态方法拦截(interception)。因此,使用AbpAuthorize特性有一些限制:
- 不能用于私有方法。
- 不能用于静态方法。
- 不能用于非注入类的方法(我们必须要使用依赖注入)。
4、 创建带有该按钮功能的角色,或者修改角色,使角色带有该菜单的功能
看Role/Create或者 Role/Update 中的grantedPermissions中填上要赋予的权限菜单就可以
5、使用IPermissionChecker验证权限
虽然AbpAuthorize特性对于大多数情况相当够用了,但是肯定存在我们会在一个方法体内检查权限的情况。我们可以注入并使用IPermissionChecker。可以看见有两个方法提供使用。
1 public interface IPermissionChecker
2 {
3 Task<bool> IsGrantedAsync(string permissionName);
4 Task<bool> IsGrantedAsync(UserIdentifier user, string permissionName);
5 }
在ApplicationService基类注入并定义了PermissionChecker属性。这样,权限检查者不需要在应用服务类中注入就可以使用了。