使用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

相关文章
|
Cloud Native Devops 持续交付
云原生与 DevOps
云原生与 DevOps
1038 0
pip install -U weditor 安装报错 error: subprocess-exited-with-error
pip install -U weditor 安装报错 error: subprocess-exited-with-error
766 0
|
人工智能 自然语言处理 Rust
【内附榜单】评估AI大模型的代码修复能力!Multi-SWE-bench:字节开源代码修复能力评估基准,覆盖7大主流编程语言
Multi-SWE-bench是首个覆盖Python外7种主流编程语言的代码修复基准,包含1632个真实GitHub问题样本,通过严格筛选与人工验证确保数据质量。
1275 0
【内附榜单】评估AI大模型的代码修复能力!Multi-SWE-bench:字节开源代码修复能力评估基准,覆盖7大主流编程语言
|
关系型数据库 MySQL 数据库
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
随着数据量增长和业务扩展,单个数据库难以满足需求,需调整为集群模式以实现负载均衡和读写分离。MySQL主从复制是常见的高可用架构,通过binlog日志同步数据,确保主从数据一致性。本文详细介绍MySQL主从复制原理及配置步骤,包括一主二从集群的搭建过程,帮助读者实现稳定可靠的数据库高可用架构。
869 9
RDS用多了,你还知道MySQL主从复制底层原理和实现方案吗?
|
存储 NoSQL Redis
Redis的数据过期策略有哪些 ?
1. 惰性删除 :只会在取出 key 的时候才对数据进行过期检查。这样对 CPU 最友好,但是可能会造成太多过期 key 没有被删除。数据到达过期时间,不做处理。等下次访问该数据时,我们需要判断 a. 如果未过期,返回数据 b. 发现已过期,删除,返回nil 2. 定期删除 : 每隔一段时间抽取一批 key 执行删除过期 key 操作。并且,Redis 底层会通过限制删除操作执行的时长和频率来减少删除操作对 CPU 时间的影响。默认情况下 Redis 定期检查的频率是每秒扫描 10 次,用于定期清除过期键。当然此值还可以通过配置文件进行设置,在 redis.conf 中修改配置“hz”
|
网络协议 安全 网络安全
探索网络模型与协议:从OSI到HTTPs的原理解析
OSI七层网络模型和TCP/IP四层模型是理解和设计计算机网络的框架。OSI模型包括物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,而TCP/IP模型则简化为链路层、网络层、传输层和 HTTPS协议基于HTTP并通过TLS/SSL加密数据,确保安全传输。其连接过程涉及TCP三次握手、SSL证书验证、对称密钥交换等步骤,以保障通信的安全性和完整性。数字信封技术使用非对称加密和数字证书确保数据的机密性和身份认证。 浏览器通过Https访问网站的过程包括输入网址、DNS解析、建立TCP连接、发送HTTPS请求、接收响应、验证证书和解析网页内容等步骤,确保用户与服务器之间的安全通信。
1042 3
|
机器学习/深度学习 自然语言处理 知识图谱
预训练模型(Pre-trained Models)
预训练模型是在大量文本数据上训练的模型,能捕捉语言的通用特征,通过微调适用于各种NLP任务。它们具备迁移学习能力,减少训练时间和资源需求,支持多任务学习,但需注意模型偏见和可解释性问题。常见模型有BERT、GPT等,广泛应用于文本分类、情感分析等领域。
1751 2
|
存储 Docker 容器
Docker工作目录迁移
Docker工作目录迁移
|
数据采集 机器学习/深度学习 文字识别
OCR -- 文本检测 - 训练DB文字检测模型
OCR -- 文本检测 - 训练DB文字检测模型
603 0