概覽介紹
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
也有其他方法來一個個地控制權限,如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為用戶刪除所有的用戶特定的權限設置。