
文章目录
2.6 ABPZero – 权限管理
概览介绍
Module-Zero实现了ABP授权系统的IPermissionChecker接口。这篇文章中,我们将会看到如何给角色和用户授予权限。
角色权限
如果我们给一个角色授予一个权限,那么这个角色的所有用户都授权了该权限(除非对于一个特定的用户显示禁止)。
我们使用RoleManager改变一个角色的权限。比如,SetGrantedPermissionsAsync可以在一个方法调用中改变一个角色的所有权限:
public class RoleAppService : IRoleAppService { private readonly RoleManager _roleManager; private readonly IPermissionManager _permissionManager; public RoleAppService(RoleManager roleManager, IPermissionManager permissionManager) { _roleManager = roleManager; _permissionManager = permissionManager; } public async Task UpdateRolePermissions(UpdateRolePermissionsInput input) { var role = await _roleManager.GetRoleByIdAsync(input.RoleId); var grantedPermissions = _permissionManager .GetAllPermissions() .Where(p => input.GrantedPermissionNames.Contains(p.Name)) .ToList(); await _roleManager.SetGrantedPermissionsAsync(role, grantedPermissions); } }
这个例子中,我们获得了一个RoleId和授予权限的名称列表(input.GrantedPermissionNames是List类型)。我们使用IPermissionManager根据名字找到所有的“权限”对象。然后我们调用SetGrantedPermissionsAsync方法来更新角色的权限。
也有其他方法来一个个地控制权限,如GrantPermissionAsync和ProhibitPermissionAsync。
用户权限
虽然对于大多说应用来说,基于角色的权限管理可能足够了,但我们可能控制每个用户的权限。当我们为一个用户定义一个权限设置时,它就重写了来自该用户角色的权限设置。
比如有这么个例子,假设我们有一个应用服务,该服务对于某个用户是没有使用权限的:
public class UserAppService : IUserAppService { private readonly UserManager _userManager; private readonly IPermissionManager _permissionManager; public UserAppService(UserManager userManager, IPermissionManager permissionManager) { _userManager = userManager; _permissionManager = permissionManager; } public async Task ProhibitPermission(ProhibitPermissionInput input) { var user = await _userManager.GetUserByIdAsync(input.UserId); var permission = _permissionManager.GetPermission(input.PermissionName); await _userManager.ProhibitPermissionAsync(user, permission); } }
用户管理者(User Manager)有许多控制用户权限的方法。在例子中,我们获得了UserId和PermissionName,并使用ProhibitPermissionAsync方法禁止一个用户拥有某个权限。
当我们禁止某个用户拥有某个权限时,即使ta的角色授予了该权限,Ta也没有获得这个权限的授权。当我们特别给某个用户授予权限时,即使该用户的角色没有授予权限,那么该用户也得到了该权限的授权。我们可以使用ResetAllPermissionsAsync为用户删除所有的用户特定的权限设置。
原文链接:
本文观点不代表 .Net中文网 立场,转载请联系原作者。