Module Zero之权限管理

时间:2024-10-08 14:33:38

返回《Module Zero学习目录》


概览介绍

Module-Zero实现了ABP授权系统的IPermissionChecker接口。这篇文章中,我们将会看到如何给角色和用户授予权限。要定义和检查权限,请转至《ABP理论学习之授权(Authorization)》

角色权限

如果我们给一个角色授予一个权限,那么这个角色的所有用户都授权了该权限(除非对于一个特定的用户显示禁止)。

我们使用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方法来更新角色的权限。

也有其他方法来一个个地控制权限,如GrantPermissionAsyncProhibitPermissionAsync

用户权限

虽然对于大多说应用来说,基于角色的权限管理可能足够了,但我们可能控制每个用户的权限。当我们为一个用户定义一个权限设置时,它就重写了来自该用户角色的权限设置。

比如有这么个例子,假设我们有一个应用服务,该服务对于某个用户是没有使用权限的:

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)有许多控制用户权限的方法。在例子中,我们获得了UserIdPermissionName,并使用ProhibitPermissionAsync方法禁止一个用户拥有某个权限。

当我们禁止某个用户拥有某个权限时,即使ta的角色授予了该权限,Ta也没有获得这个权限的授权。当我们特别给某个用户授予权限时,即使该用户的角色没有授予权限,那么该用户也得到了该权限的授权。我们可以使用ResetAllPermissionsAsync为用户删除所有的用户特定的权限设置。