通过上一篇.Net Core官方的 JWT 授权验证学习到了JWT的授权。可以发现一个问题,就是如果每个接口可以使用的角色都是写死的,这样如果有所修改会非常麻烦,虽然用policy可以一定程度上缓解,但是还是不能根治。

所以,就需要动态的设置接口与权限,由我们自己来处理。

我们先创建一个类 PermissionRequirement 继承接口 IAuthorizationRequirement,这个类是接口与角色的关系类,里面的字段可以按自己的需要添加。

public class PermissionRequirement : IAuthorizationRequirement
{
  public string Url { get; set; }
  public List<string> Roles { get; set; }
}

之后创建一个处理类 PermissionHandler 继承 AuthorizationHandler 类,来处理请求中接口和角色权限的关系。

public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
{
protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
{
//模拟从数据库或者缓存中取出的访问url的权限数据
var roles = new List<PermissionRequirement>();
roles.Add(new PermissionRequirement() { Url = "weatherforecast", Roles = new List<string>() { "system" } });
//JWT的token中的声明等信息都会自动解析在context中
var resource = ((Microsoft.AspNetCore.Routing.RouteEndpoint)context.Resource).RoutePattern;
foreach(var t in context.User.Identities)
{
foreach(var claim in t.Claims)
{
//通过Type可以判断声明的类型,这里处理role的声明获取角色信息
if(claim.Type == ClaimTypes.Role)
{
if(roles.Exists(x => x.Roles.Exists(role => role == claim.Value) && x.Url == resource.RawText.ToLower()))
{
context.Succeed(requirement);
return;
}
}
}
}
context.Fail();
return;
}
}

在 Startup 类中其他都不变,只需要添加在 ConfigureServices 方法中添加上如下代码即可,通过以来注入 PermissionHandler 类来替换成我们的处理类。

services.AddAuthorization(option => {
//option.AddPolicy("adminOrSystem", policy => policy.RequireRole("admin", "system"));
option.AddPolicy("Permission", policy => policy.AddRequirements(permissionRequirement));
});
services.AddSingleton<IAuthorizationHandler, PermissionHandler>();
// 将授权必要类注入生命周期内
services.AddSingleton(permissionRequirement);

最后只需要在接口或控制器上添加 [Authorize(Policy = "Permission")] 就可以啦,只要有该特性的接口访问都会走我们的处理类 PermissionHandler 判断接口和角色的关系,从而实现了动态设置接口和权限的要求。

我这里的代码比较的简陋,最低限度的实现,可以自己根据需求完善。也可以看下面的参考文章。

参考文章:

ASP.NET Core 使用 JWT 自定义角色/策略授权需要实现的接口

从壹开始前后端分离[.NetCore] 37 ║JWT完美实现权限与接口的动态分配

.Net Core JWT 动态设置接口与权限的更多相关文章

  1. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  2. postman提取接口的返回值及动态设置变量(一)

    一.提取接口返回值   1.当返回值是返回JSON时 let json = JSON.parse(responseBody); // responseBody是包含整个返回内容的字符串 let foo ...

  3. nfs 动态文件挂载读写权限设置

    nfs 动态文件挂载读写权限设置 待办 ll 命令查看文件夹权限 参考设置共享文件夹https://www.linuxidc.com/Linux/2018-11/155331.htm

  4. dotnet core JWT Demo

    JWT介绍 JSON Web Token(JWT)是目前最流行的跨域身份验证解决方案.JWT的官网地址:https://jwt.io/. 通俗地来讲,JWT是能代表用户身份的令牌,可以使用JWT令牌在 ...

  5. 三分钟学会.NET Core Jwt 策略授权认证

    一.前言 大家好我又回来了,前几天讲过一个关于Jwt的身份验证最简单的案例,但是功能还是不够强大,不适用于真正的项目,是的,在真正面对复杂而又苛刻的客户中,我们会不知所措,就现在需要将认证授权这一块也 ...

  6. springBoot整合spring security+JWT实现单点登录与权限管理--筑基中期

    写在前面 在前一篇文章当中,我们介绍了springBoot整合spring security单体应用版,在这篇文章当中,我将介绍springBoot整合spring secury+JWT实现单点登录与 ...

  7. spring boot 2 集成JWT实现api接口认证

    JSON Web Token(JWT)是目前流行的跨域身份验证解决方案.官网:https://jwt.io/本文使用spring boot 2 集成JWT实现api接口验证. 一.JWT的数据结构 J ...

  8. Shiro实现用户对动态资源细粒度的权限校验

    前言 在实际系统应用中,普遍存在这样的一种业务场景,需要实现用户对要访问的资源进行动态权限校验. 譬如,在某平台的商家系统中,存在商家.品牌.商品等业务资源.它们之间的关系为:一个商家可以拥有多个品牌 ...

  9. ASP.NET Core搭建多层网站架构【9.2-使用Castle.Core实现动态代理拦截器】

    2020/01/31, ASP.NET Core 3.1, VS2019, Autofac.Extras.DynamicProxy 4.5.0, Castle.Core.AsyncIntercepto ...

随机推荐

  1. Ideas and Tricks Part II

    33.对于统计答案幂次的技巧 对于$x^k$,考虑其组合意义:将$k$个不同球放到$x$个不同的盒子里的方案数,直接维护不好维护,那么考虑枚举把这些球放到了哪些盒子里,最后乘上第二类斯特林数和对于的阶 ...

  2. dhcp、tftp、httpd、pxe安装CentOS6.9

    虚拟机网络设置 要xshell连接虚拟机注意设置VMware Network Adapter VMnet2在同一网段 1.利用光盘配置本地yum源 [root@ZYB ~]# mount -r /de ...

  3. sdsd

    自本人拥有手机以来,由于有存短信的特殊嗜好,得出以下不完全统计: 累计中奖93次,资金共计2260万元(人民币),另有各种iphone68部, 电脑36台,轿车27辆,收到法院传票93张,被大学录取5 ...

  4. 9 HTTP和HTTPS

    9 HTTP和HTTPS 状态码 定义 1xx 报告 接收到请求,继续进程 2xx 成功 步骤成功接收,被理解,并被接受 3xx 重定向 为了完成请求,必须采取进一步措施 4xx 客户端出错 请求包括 ...

  5. layui表单一

    1. ***首先明确一点 表单的以来加载模块是 form.如果不加载form模块,select.checkbox.radio等将无法显示,并且无法使用form相关功能. 我们用layui官网的样本来做 ...

  6. C# 泛型集合的自定义类型排序

    一.泛型集合List<T>排序 经sort方法之后,采用了升序的方式进行排列的. List<int> list = new List<int>() { 2, 4, ...

  7. Hadoop2.6伪分布式按照官网指点安装(1)

    参考:http://hadoop.apache.org/docs/r2.6.0/hadoop-project-dist/hadoop-common/SingleCluster.html 照抄:安装成功 ...

  8. 处理request信息的ngx_http_process_request

    在处理完http的头部信息后  然后在 处理request-body信息ngx_http_process_request-------- -----------ngx_http_process_req ...

  9. MYSQL 存储引擎(面)

    存储引擎是MySQL的组件,用于处理不同表类型的SQL操作.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以获得特定的功能. 使用哪一种引擎可以灵活选择,一个数据 ...

  10. Redis 用的很溜,了解过它用的什么协议吗?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...