SpringCloudGateWay和Sentinel结合做黑白名单来源控制

假设我们的分布式项目,admin是8087,gateway是8088,consumer是8086

我们一般的思路是我们的请求必须经过我们的网关8088然后网关转发到我们的分布式项目,那我要是没有处理我们绕过网关直接访问项目8087和8086不也是可以?

所以我们会有个黑白名单来源控制来对这种特殊情况做处理

不用sentinel的做法

我们在网关那在转发请求的时候+一个请求头,请求头的值固定

然后这个请求头相当于密钥我们不会对外暴露,然后在java代码的拦截器中我们拦截请求判断这个请求头是否和配置一样

优点:简单

缺点:我们要是请求头泄漏,我们发起请求的时候可以伪造请求头这样子我们仍然能跨网关访问

用Sentinel的做法

sentinel+请求头判断来源做法

控制调用方

把我们的调用方分为白名单和黑名单

我们要的名称其实是origin

RequestOriginParser接口

我们的sentinel是通过这个接口里的parseOrigin()这个方法,来获取请求的来源的

这个方法的作用就是,从我们的request对象中解析出我们的origin的值

可惜,默认情况下这个方法返回的结果是default

如果不为空,那我们就把我们的origin作为请求头返回

如果浏览器获得的origin头和网关获取的请求头不一样,那他们的来源名称就不一样

这样子我们就可以来编写我们的规则了

区分请求是否经过网关

然后我们的网关有一个过滤器

请求头的名字是origin,然后值是gateway


 

这样我们从网关过来的就有请求头,然后不是从网关过来的就没有请求头

之前如果我们知道正确的url,我们甚至可以绕过网关进行访问,这样子一点都不安全


实现步骤

连接RequestOriginParser接口

然后我们把它注册成一个bean

为网关添加过滤器

看到没,我们网关配置的请求头的origin的值是gateway

总结

我们的sentinel是用这个方法来获取我们的请求来源的

你看我们的返回值是String,我们就通过这个String来判断我们的请求来源

我们默认请求头有origin这个参数

因为我们配置从网关来的,我们的origin的参数时gateway

添加授权


我们刚刚的那个方法返回的参数,就是我们的来源的名称

然后填写我们的来源名称

我们用8088端口绕过网关,发现不行


sentinel限制IP做法 

  • 在业务服务中配置 Sentinel 的 IP 限制规则,只允许网关的 IP 访问。

  • 这种方式适用于网关和服务部署在同一内网环境的情况。

实现步骤

  1. 获取网关的 IP

    • 假设网关的 IP 是 192.168.1.100

  2. 配置 Sentinel 规则

    • 在业务服务中配置 Sentinel 的白名单规则只允许网关的 IP 访问。                               

      import com.alibaba.csp.sentinel.slots.block.RuleConstant;
      import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
      import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
      import org.springframework.context.annotation.Configuration;import javax.annotation.PostConstruct;
      import java.util.Collections;@Configuration
      public class SentinelAuthorityRuleConfig {/*** 配置 Sentinel 的 IP 白名单规则*/@PostConstructpublic void initAuthorityRule() {// 创建 AuthorityRule 规则AuthorityRule rule = new AuthorityRule();rule.setResource("gateway_ip_whitelist"); // 资源名称rule.setStrategy(RuleConstant.AUTHORITY_WHITE); // 白名单模式rule.setLimitApp("192.168.1.100"); // 只允许 Gateway 的 IP 访问// 加载规则AuthorityRuleManager.loadRules(Collections.singletonList(rule));}
      }

3.业务服务层

  • 在业务服务中启用 Sentinel 的流控功能,确保只有网关的请求可以通过

Gateway 的 IP

  • 情况说明:如果 Gateway 没有进行特殊的配置来传递客户端 IP 信息,那么后端服务接收到的请求中的 IP 地址通常是 Gateway 的 IP 地址。
  • 实现方式:这是比较常见的默认情况,例如一些简单的网络代理服务器在转发请求时,如果没有专门设置修改请求头中的 IP 相关信息,后端服务器就只能看到代理服务器(即 Gateway)的 IP 地址,因为在网络数据包传输过程中,源 IP 地址会被替换为 Gateway 的出口 IP 地址。

 如果我们要保留之前的客户端请求的IP,我们要在Gateway做额外处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/894773.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#面试常考随笔12:游戏开发中常用的设计模式【C#面试题(中级篇)补充】

C#面试题(中级篇),详细讲解,帮助你深刻理解,拒绝背话术!-CSDN博客 简单工厂模式 优点: 根据条件有工厂类直接创建具体的产品 客户端无需知道具体的对象名字,可以通过配置文件创建…

数字人|通过语音和图片来创建高质量的视频

简介 arXiv上的计算机视觉领域论文: AniPortrait: Audio-Driven Synthesis of Photorealistic Portrait Animation AniPortrait:照片级真实感肖像动画的音频驱动合成 核心内容围绕一种新的人像动画合成框架展开。 研究内容 提出 AniPortrait 框架&a…

数据结构实战之线性表(三)

目录 1.顺序表释放 2.顺序表增加空间 3.合并顺序表 4.线性表之链表实现 1.项目结构以及初始代码 2.初始化链表(不带头结点) 3.链表尾部插入数据并显示 4.链表头部插入数据 5.初始化链表(带头结点) 6.带头结点的链表头部插入数据并显示 7.带头结…

Docker使用指南(一)——镜像相关操作详解(实战案例教学,适合小白跟学)

目录 1.镜像名的组成 2.镜像操作相关命令 镜像常用命令总结: 1. docker images 2. docker rmi 3. docker pull 4. docker push 5. docker save 6. docker load 7. docker tag 8. docker build 9. docker history 10. docker inspect 11. docker prune…

C++基础day1

前言:谢谢阿秀,指路阿秀的学习笔记 一、基础语法 1.构造和析构: 类的构造函数是一种特殊的函数,在创建一个新的对象时调用。类的析构函数也是一种特殊的函数,在删除所创建的对象时调用。 构造顺序:父类->子类 析…

尝试ai生成figma设计

当听到用ai 自动生成figma设计时,不免好奇这个是如何实现的。在查阅了不少资料后,有了一些想法。参考了:在figma上使用脚本自动生成色谱 这篇文章提供的主要思路是:可以通过脚本的方式构建figma设计。如果我们使用ai 生成figma脚本…

iOS 老项目适配 #Preview 预览功能

前言 iOS 开发者 最憋屈的就是UI 布局慢,一直以来没有实时预览功能,虽然swiftUI 早就支持了,但是目前主流还是使用UIKit在布局,iOS 17 苹果推出了 #Preview 可以支持UIKit 实时预览,但是仅仅是 iOS 17,老项目怎么办呢?于是就有了这篇 老项目适配 #Preview 预览 的文章,…

【分布式架构理论2】分布式架构要处理的问题及解决方案

文章目录 1. 应用服务拆分2. 分布式调用3. 分布式协同4. 分布式计算5. 分布式存储6. 分布式资源管理与调度7. 高性能与可用性优化8. 指标与监控 将分布式架构需要解决的问题按照顺序列举为如下几步 问题分类具体内容应用服务拆分分布式是用分散的服务和资源代替集中的服务和资…

【PyQt】pyqt小案例实现简易文本编辑器

pyqt小案例实现简易文本编辑器 分析 实现了一个简单的文本编辑器,使用PyQt5框架构建。以下是代码的主要功能和特点: 主窗口类 (MyWindow): 继承自 QWidget 类。使用 .ui 文件加载用户界面布局。设置窗口标题、状态栏消息等。创建菜单栏及其子菜单项&…

Unity中的虚拟相机(Cinemachine)

Unity Cinemachine详解 什么是Cinemachine Cinemachine是Unity官方推出的智能相机系统,它提供了一套完整的工具来创建复杂的相机运动和行为,而无需编写大量代码。它能够大大简化相机管理,提高游戏开发效率。 Cinemachine的主要组件 1. Vi…

【PyQt】getattr动态访问对象的属性

问题 使用qtdesigner设计好大体的软件结构,需要使用代码进行批量修改控件样式,self.ui.x 会被解释为访问 self.ui 中名为 x 的属性,而不是将 x 作为变量名来解析,此时需要通过字符串动态访问 self.ui 中的按钮对象 for i in range(20):x f…

【电脑系统】电脑突然(蓝屏)卡死发出刺耳声音

文章目录 前言问题描述软件解决方案尝试硬件解决方案尝试参考文献 前言 在 更换硬盘 时遇到的问题,有时候只有卡死没有蓝屏 问题描述 更换硬盘后,电脑用一会就卡死,蓝屏,显示蓝屏代码 UNEXPECTED_STORE_EXCEPTION 软件解决方案…

DEEPSEKK GPT等AI体的出现如何重构工厂数字化架构:从设备控制到ERP MES系统的全面优化

随着深度学习(DeepSeek)、GPT等先进AI技术的出现,工厂的数字化架构正在经历前所未有的变革。AI的强大处理能力、预测能力和自动化决策支持,将大幅度提升生产效率、设备管理、资源调度以及产品质量管理。本文将探讨AI体&#xff08…

【大模型LLM面试合集】大语言模型架构_Transformer架构细节

Transformer架构细节 1.Transformer各个模块的作用 (1)Encoder模块 经典的Transformer架构中的Encoder模块包含6个Encoder Block. 每个Encoder Block包含两个⼦模块, 分别是多头⾃注意⼒层, 和前馈全连接层. 多头⾃注意⼒层采⽤的是⼀种Scaled Dot-Pr…

【华为OD-E卷 - 113 跳格子2 100分(python、java、c++、js、c)】

【华为OD-E卷 - 跳格子2 100分(python、java、c、js、c)】 题目 小明和朋友玩跳格子游戏,有 n 个连续格子组成的圆圈,每个格子有不同的分数,小朋友可以选择以任意格子起跳,但是不能跳连续的格子&#xff…

订单状态监控实战:基于 SQL 的状态机分析与异常检测

目录 1. 背景与问题 2. 数据准备 2.1 表结构设计 3. 场景分析与实现 3.1 场景 1:检测非法状态转换

说一下JVM管理的常见参数

Java虚拟机&#xff08;JVM&#xff09;有许多常见参数&#xff0c;用于控制其行为和性能。以下是一些常见的JVM参数及其说明&#xff1a; 1. 内存管理参数 -Xms<size> START 设置初始堆内存大小。例如&#xff0c;-Xms512m表示初始堆大小为512MB。 -Xmx<size>…

验证工具:GVIM和VIM

一、定义与关系 gVim&#xff1a;gVim是Vim的图形界面版本&#xff0c;提供了更多的图形化功能&#xff0c;如菜单栏、工具栏和鼠标支持。它使得Vim的使用更加直观和方便&#xff0c;尤其对于不习惯命令行界面的用户来说。Vim&#xff1a;Vim是一个在命令行界面下运行的文本编…

4 HBase 的高级 shell 管理命令

4 HBase 的高级 shell 管理命令 1.status 例如&#xff1a;显示服务器状态 hbase(main):058:0> status node012.whoami 显示 HBase 当前用户&#xff0c;例如&#xff1a; hbase> whoami3.list 显示当前所有的表 hbase> list4.count 统计指定表的记录数&#xff0c…

Web - CSS3基础语法与盒模型

概述 这篇文章是关于 Web 前端 CSS3 的基础语法与盒模型的讲解。包括 CSS3 层叠性及处理冲突规则、伪元素和新增伪类元素、属性选择器等。还介绍了文本与字体属性&#xff0c;如段落和行相关属性、字体文本属性。最后阐述了盒子模型&#xff0c;如元素隐藏、行内与块元素转换、…