使用RoleBasedAuthorization实现基于用户角色的访问权限控制

简介: 本文将介绍如何通过 [Sang.AspNetCore.RoleBasedAuthorization](https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization) 库实现 RBAC 权限管理。

使用介绍

Step 1

添加库 Sang.AspNetCore.RoleBasedAuthorization

Install-Package Sang.AspNetCore.RoleBasedAuthorization

Step 2

Program.cs 中添加

builder.Services.AddSangRoleBasedAuthorization();

Step 3

在需要进行授权检查的接口或 Controller 处添加 ResourceAttribute 标记。

[Resource("资源")]
[Route("api/[controller]")]
[ApiController]
public class RolesController : ControllerBase
{
}
/// <summary>
/// 删除-数值
/// </summary>
/// <param name="id"></param>
[Resource("删除-数值")] //[Resource("删除", Action = "数值")]
[HttpDelete("{id}")]
public IActionResult Delete(int id)
{
    return Ok("删除-数值");
}

这里用于描述访问的角色需要的资源要求

  • 填写单独的整个资源 “[Resource("资源")]”
  • 或使用 Action 设置资源下的某个操作 “[Resource("资源", Action = "操作")]”
  • 也可以使用形如“[Resource("资源-操作")]”直接设置资源和操作

Step 4

完成以上操作后,授权检查,将检查User.Claims是否存在对应的Permission

需要为用户添加对应的 Claims ,可以在生成 jwt token 时直接包含。

当然也可以使用中间件读取对应的角色,在授权检查前添加,可以自己实现也可以使用该库提供的下一节介绍的功能。

var claims = new List<Claim>
{
    new Claim(ClaimTypes.NameIdentifier, "uid"),
    new Claim(ClaimTypes.Name,"用户名"),
    new Claim(ClaimTypes.Email,"test@exp.com"),
    new Claim(ClaimTypes.Role, "user"),
    new Claim(ResourceClaimTypes.Permission,"查询"),
};
var token = new JwtSecurityToken(
        "Issuer",
        "Audience",
        claims,
        expires: DateTime.UtcNow.AddSeconds(3600),
        signingCredentials: credentials
    );
注意:如果角色名为 SangRBAC_Administrator,将不进行授权检查。

可选中间件

使用提供的添加角色权限中间件,你也可以单独使用该组件。

Step 1

实现IRolePermission,通过角色名获取该角色权限列表

public class MyRolePermission : IRolePermission
{
    public Task<List<Claim>> GetRolePermissionClaimsByName(string roleName)
    {
        List<Claim> list = new();
        // you code
        return Task.FromResult(list);
    }
}

然后添加服务。

builder.Services.AddRolePermission<MyRolePermission>();

Step 2

app.UseAuthorization();app.UseAuthentication()后启用这个中间件。

app.UseAuthentication();
app.UseRolePermission();
app.UseAuthorization();

Option

UseRolePermission

1. option.UserAdministratorRoleName:

设置一个自定义角色,使其拥有 SangRBAC_Administrator 一样的系统内置超级管理员权限。

2. option.Always:

是否一直检查并执行添加,默认只有在含有 ResourceAttribute 要进行权限验证时,此次访问中间件才启动添加权限功能。

app.UseRolePermission(opt => {
    // 设置系统内置超级管理员的rolename
    opt.userAdministratorRoleName = "supadmin";
    option.Always = true;
});

Demo

相关文章
|
8天前
|
存储 监控 安全
数据访问权限如何通过角色管理实现?
【6月更文挑战第24天】数据访问权限如何通过角色管理实现?
25 9
|
5天前
|
JSON 数据格式
|
9月前
|
资源调度 前端开发 数据库
权限 | 前端控制权限
啊,我们经常做权限控制,控制菜单,控制按钮功能等,但是在一些特殊情况下不能够由后端来做权限控制,那就只能前端来做啦。
|
数据安全/隐私保护
13-企业权限管理-用户关联角色操作
13-企业权限管理-用户关联角色操作
13-企业权限管理-用户关联角色操作
|
数据安全/隐私保护
14-企业权限管理-角色关联权限操作
14-企业权限管理-角色关联权限操作
|
XML 数据格式
有关 用户&角色 分配的问题
有关 用户&角色 分配的问题
120 0
|
存储 Java 数据库连接
纳税服务系统四(角色模块)【角色与权限、角色与用户】(三)
之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175
309 0
纳税服务系统四(角色模块)【角色与权限、角色与用户】(三)
|
数据库 数据安全/隐私保护
纳税服务系统四(角色模块)【角色与权限、角色与用户】(一)
之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175
215 0
纳税服务系统四(角色模块)【角色与权限、角色与用户】(一)
|
SQL 存储 Java
纳税服务系统四(角色模块)【角色与权限、角色与用户】(二)
之前在Servlet+JSP+JavaBean的时候其实我们已经做过了用户-角色-权限之间的操作【权限管理系统】http://blog.csdn.net/hon_3y/article/details/61926175
161 0
纳税服务系统四(角色模块)【角色与权限、角色与用户】(二)