前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >使用RoleBasedAuthorization实现基于用户角色的访问权限控制

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

作者头像
桑榆肖物
发布2022-11-18 10:14:21
1.3K0
发布2022-11-18 10:14:21
举报
文章被收录于专栏:桑榆肖物

本文将介绍如何通过 Sang.AspNetCore.RoleBasedAuthorization[1] 库实现 RBAC 权限管理。

使用介绍

Step 1

添加库 Sang.AspNetCore.RoleBasedAuthorization

代码语言:javascript
复制
Install-Package Sang.AspNetCore.RoleBasedAuthorization
Step 2

Program.cs 中添加

代码语言:javascript
复制
builder.Services.AddSangRoleBasedAuthorization();
Step 3

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

代码语言:javascript
复制
[Resource("资源")]
[Route("api/[controller]")]
[ApiController]
public class RolesController : ControllerBase
{
}
代码语言:javascript
复制
/// <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 时直接包含。

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

代码语言:javascript
复制
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,通过角色名获取该角色权限列表

代码语言:javascript
复制
public class MyRolePermission : IRolePermission
{
    public Task<List<Claim>> GetRolePermissionClaimsByName(string roleName)
    {
        List<Claim> list = new();
        // you code
        return Task.FromResult(list);
    }
}

然后添加服务。

代码语言:javascript
复制
builder.Services.AddRolePermission<MyRolePermission>();

Step 2

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

代码语言:javascript
复制
app.UseAuthentication();
app.UseRolePermission();
app.UseAuthorization();

Option

UseRolePermission

1. option.UserAdministratorRoleName:

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

2. option.Always:

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

代码语言:javascript
复制
app.UseRolePermission(opt => {
    // 设置系统内置超级管理员的rolename
    opt.userAdministratorRoleName = "supadmin";
    option.Always = true;
});

Demo

•简单示例 https://github.com/sangyuxiaowu/Sang.AspNetCore.RoleBasedAuthorization/tree/main/TestDemo•在 Identity 中使用 https://github.com/sangyuxiaowu/IdentityRBAC

References

[1] Sang.AspNetCore.RoleBasedAuthorization: https://www.nuget.org/packages/Sang.AspNetCore.RoleBasedAuthorization

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 桑榆肖物 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用介绍
    • Step 1
    • 可选中间件
      • Step 1
        • Step 2
          • Option
            • Demo
              • References
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档