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

server/2025/2/8 23:35:38/

假设我们的分布式项目,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.ppmy.cn/server/166057.html

相关文章

【Apache Paimon】-- 15 -- 利用 paimon-flink-action 同步 postgresql 表数据

利用 Paimon Schema Evolution 核心特性同步变更的 postgresql 表结构和数据 1、背景信息 在Paimon 诞生以前,若 mysql/pg 等数据源的表结构发生变化时,我们有几种处理方式 (1)人工消息通知,然后手动同步到数据仓库中(2)使用 flink 消费 DDL binlog ,然后自动更新 Hi…

Racecar Gym

Racecar Gym 参考:https://github.com/axelbr/racecar_gym/blob/master/README.md 1. 项目介绍 Racecar Gym 是一个基于 PyBullet 物理引擎的 reinforcement learning (RL) 训练环境,模拟微型 F1Tenth 竞速赛车。它兼容 Gym API 和 PettingZoo API&am…

嵌入式面试题 C/C++常见面试题整理_7

一.什么函数不能声明为虚函数? 常见的不能声明为虚函数的有:普通函数(非成员函数):静态成员函数;内联成员函数;构造函数;友元函数。 1.为什么C不支持普通函数为虚函数?普通函数(非成员函数)只能被overload,不能被override,声明为虚函数也没有什么意思…

Itext pdf reader解析

本文基于Itext 5,Itext7相较itext5虽然有较大变化,但是原理是一样的。 参考资料: 使用iText处理pdf文件的入门级教程_itextpdf 教程-CSDN博客 比较详实的介绍了长用的itext 的pdf处理。 深入iText7:第5章源代码实践指南-CSDN博…

【R语言】环境空间

一、环境空间的特点 环境空间是一种特殊类型的变量,它可以像其它变量一样被分配和操作,还可以以参数的形式传递给函数。 R语言中环境空间具有如下3个特点: 1、对象名称唯一性 此特点指的是在不同的环境空间中可以有同名的变量出现&#x…

软考教材重点内容 信息安全工程师 第15章 网络安全主动防御技术与应用

目录 15.1.1 人侵阻断技术原理 15.1.2 人侵阻断技术应用 15.3 网络流量清洗技术与应用 15.3.1 网络流量清洗技术原理 15.3.2 网络流量清洗技术应用 15.4 可信计算技术与应用 15.4.1 可信计算技术原理 15.5 数字水印技术与应用 15.5.1 数字水印技术原理 15.5.2 数字水…

Python从0到100(八十七):CNN网络详细介绍及WISDM数据集模型仿真

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

基于SpringBoot+mybatis+layui就业管理系统设计和实现

基于SpringBootmybatislayui就业管理系统设计和实现 🍅 作者主页 网顺技术团队 🍅 欢迎点赞 👍 收藏 ⭐留言 📝 🍅 文末获取源码联系方式 📝 🍅 查看下方微信号获取联系方式 承接各种定制系统 &…