当前位置: 首页 > news >正文

Sentinel黑白名单授权规则解读

目录

基本介绍 

代码实战

架构说明

RequestOriginParser的实现类  

网关添加请求头 

配置授权规则


基本介绍 

授权规则可以对请求方来源做判断和控制。

很多时候,我们需要根据调用来源来判断该次请求是否允许放行,这时候可以使用 Sentinel 的来源访问控制(黑白名单控制)的功能。来源访问控制根据资源的请求来源(origin)限制资源是否通过,若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

授权规则可以对调用方的来源做控制,有白名单和黑名单两种方式。

  • 白名单:来源(origin)在白名单内的调用者允许访问

  • 黑名单:来源(origin)在黑名单内的调用者不允许访问

来源访问控制规则(AuthorityRule)非常简单,主要有以下配置项:

  • resource:资源名,即限流规则的作用对象。
  • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。

比如我们希望控制对资源 test 的访问设置白名单,只有来源为 appAappB 的请求才可通过,则可以配置如下白名单规则:

AuthorityRule rule = new AuthorityRule();
rule.setResource("test");
rule.setStrategy(RuleConstant.AUTHORITY_WHITE);
rule.setLimitApp("appA,appB");
AuthorityRuleManager.loadRules(Collections.singletonList(rule));

Sentinel是通过RequestOriginParser这个接口的parseOrigin来获取请求的来源的。

public interface RequestOriginParser {/*** 从请求request对象中获取origin,获取方式自定义*/String parseOrigin(HttpServletRequest request);
}

 这个方法的作用就是从request对象中,获取请求者的origin值并返回。

默认情况下,sentinel不管请求者从哪里来,返回值永远是default,也就是说一切请求的来源都被认为是一样的值default。因此,我们需要自定义这个接口的实现,让不同的请求,返回不同的origin

代码实战

架构说明

 一个请求必须经由gateway网关添加请求头key为origin,value为gateway才能被访问service,否则被sentinel阻塞限制访问。

RequestOriginParser的实现类  

再service服务中,我们定义一个RequestOriginParser的实现类:

@Component
public class HeaderOriginParser implements RequestOriginParser {@Overridepublic String parseOrigin(HttpServletRequest request) {// 1.获取请求头String origin = request.getHeader("origin");// 2.非空判断if (StringUtils.isEmpty(origin)) {origin = "blank";}return origin;}
}

我们会尝试从request-header中获取origin值。  

网关添加请求头 

既然获取请求origin的方式是从reques-header中获取origin值,我们必须让所有从gateway路由到微服务的请求都带上origin头

利用一个GatewayFilter来实现,AddRequestHeaderGatewayFilter。修改gateway服务中的application.yml,添加一个defaultFilter:

spring:cloud:gateway:default-filters:- AddRequestHeader=origin,gatewayroutes:# ...略

这样,从gateway路由的所有请求都会带上origin头,值为gateway。而从其它地方到达微服务的请求则没有这个头。

配置授权规则

添加一个授权规则,放行origin值为gateway的请求。

SentinelHystrixresilience4j
隔离策略信号量隔离(并发线程数限流)线程池隔离/信号量隔离信号量隔离
熔断降级策略基于响应时间、异常比率、异常数基于异常比率基于异常比率、响应时间
实时统计实现滑动窗口(LeapArray)滑动窗口(基于 RxJava)Ring Bit Buffer
动态规则配置支持多种数据源支持多种数据源有限支持
扩展性多个扩展点插件的形式接口的形式
基于注解的支持支持支持支持
限流基于 QPS,支持基于调用关系的限流有限的支持Rate Limiter
流量整形支持预热模式、匀速器模式、预热排队模式不支持简单的 Rate Limiter 模式
系统自适应保护支持不支持不支持
控制台提供开箱即用的控制台,可配置规则、查看秒级监控、机器发现等简单的监控查看不提供控制台,可对接其它监控系统
http://www.lryc.cn/news/219644.html

相关文章:

  • Spring底层原理学习笔记--第二讲--(BeanFactory实现与ApplicaitonContext实现)
  • 云原生|kubernetes |kubelet服务加入系统守护进程supervisor(centos7系统下演示通过)
  • onnx 模型加载部署运行方式
  • 第68讲:MySQL触发器的核心概念以及常见的触发类型应用案例
  • VS Code 开发 Spring Boot 类型的项目
  • 数据中心加密:保障数据安全的重要一环
  • 分享90个节日庆典PPT,总有一款适合您
  • Python Faker批量生成测试数据
  • Docker-compose 运行MySQL 连接不上
  • Educational Codeforces Round 2 D 计算几何
  • hexo博客发布换电脑换地方了怎么办?
  • 最新知识付费变现小程序源码/独立后台知识付费小程序源码/修复登录接口
  • 奥威BI软件 | 职场人的数据可视化救星
  • 最长公共前缀[简单]
  • Java后端开发(十一)-- Mysql8的详细安装与环境配置
  • 什么是Spring?什么是IOC?什么是DI?IOC和DI的关系? —— 零基础可无压力学习,带源码
  • PyTorch 从tensor.grad 看 backward(权重参数) 和 gradient accumulated
  • fedora 命令行代理proxychains 使用flatpak下载 flathub包
  • 介绍kamailio的dialog模块
  • 性能优于BERT的FLAIR:一篇文章入门Flair模型
  • Weblogic ssrf漏洞复现
  • Memcached构建缓存服务器
  • vue3+element Plus实现弹框的拖拽、可点击底层页面功能
  • Vue+elementui 纯前端实现Excel导入导出功能(区分表头标题)
  • 使用Scrapy的调试工具和日志系统定位并解决爬虫问题
  • Pycharm安装配置Pyqt5教程(保姆级)
  • 基于单片机的养殖场温度控制系统设计
  • 时序分解 | Matlab实现EMD经验模态分解时间序列信号分解
  • 解决无法进入MERCURY路由器管理界面的问题 水星网络路由器
  • Ansible自动化安装部署及使用