• Module Zero之权限管理


    返回《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为用户删除所有的用户特定的权限设置。

  • 相关阅读:
    Clean Docker <none>:<none>
    Conservation Vs Non-conservation Forms of conservation Equations
    What are the differences between an LES-SGS model and a RANS based turbulence model?
    How to permanently set $PATH on Linux/Unix?
    tar解压命令
    C++ (P199—P211)多态 虚函数 抽象类
    C++ (P160—)多继承 二义性 虚基类 “向上转型”
    java与c++的访问权限的问题
    由strupr,strlwr体会如果将字符常量转换为变量进行修改,体会常量的静态存储
    C++ (P103—P154)
  • 原文地址:https://www.cnblogs.com/farb/p/ModuleZeroPermissonManagement.html
Copyright © 2020-2023  润新知