什么是网关鉴权及其在Spring Cloud Gateway中的实现
在现代微服务架构中,网关扮演着非常重要的角色,它是系统和外部世界之间的入口,负责路由请求、流量控制以及安全保护等任务。其中,网关鉴权是保障系统安全的重要环节之一。本文将深入介绍什么是网关鉴权,以及如何通过过滤器来实现网关鉴权,同时探讨如何利用Spring Cloud Gateway来实现这一目标。
什么是网关鉴权?
网关鉴权是指在请求到达系统之前对请求进行身份验证和授权的过程。通常包括两个主要方面:
-  
身份验证:验证请求的发起者的身份是否合法,通常涉及用户的认证,确认其身份是否在系统中注册并且具有相应的权限。
 -  
授权:确定请求发起者是否有权限访问所请求的资源,即对请求进行权限验证,保证用户只能访问其有权限的资源。
 
如何通过过滤器来实现网关鉴权?
在Spring Cloud Gateway中,可以通过自定义过滤器来实现网关鉴权。过滤器是一种处理HTTP请求的机制,可以在请求到达网关之前或者之后执行一些操作。在网关鉴权中,我们主要关注两种过滤器:GlobalFilter和 GatewayFilter。
- GlobalFilter:全局过滤器,它会在请求进入网关之后,在路由之前执行。通常用于全局性的逻辑,比如日志记录、全局异常处理等。在网关鉴权中,可以利用全局过滤器进行统一的身份验证和权限检查。
 
@Component
public class AuthGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在此处进行身份验证和权限检查逻辑// 如果身份验证失败或者权限不足,则直接返回未授权的响应// 否则,继续执行后续的过滤器和路由处理逻辑HttpHeaders headers = exchange.getRequest().getHeaders();String token = headers.getFirst("Authorization");if (token == null || !token.equals("valid_token")) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}
}
 
- GatewayFilter:网关过滤器,它可以在请求进入网关之后,通过路由之后执行。每个路由可以有自己的一组过滤器。在网关鉴权中,可以利用网关过滤器针对特定的路由进行定制化的鉴权逻辑。
 
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {public AuthGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {// 在此处进行定制化的鉴权逻辑// 可以根据请求信息和配置进行权限验证等操作// 如果鉴权失败,则直接返回未授权的响应// 否则,继续执行后续的过滤器和路由处理逻辑ServerHttpRequest request = exchange.getRequest();String token = request.getHeaders().getFirst("Authorization");if (token == null || !token.equals("valid_token")) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);};}public static class Config {// 可以在这里定义一些配置属性,用于定制化过滤器的行为}
}
 
如何通过Spring Cloud Gateway来实现网关鉴权?
Spring Cloud Gateway提供了丰富的功能和灵活的扩展机制,使得网关鉴权变得简单而又强大。下面是一些实现网关鉴权的步骤:
- 配置路由规则:首先需要配置路由规则,指定请求应该如何被路由到后端服务。
 
spring:cloud:gateway:routes:- id: service-routeuri: http://localhost:8081predicates:- Path=/service/**filters:- name: Authargs:config:# 可以在这里配置过滤器的行为
 
在这个示例中,我们配置了一个名为service-route的路由,将所有路径以/service/开头的请求路由到http://localhost:8081这个后端服务。并且我们通过filters属性指定了名为Auth的过滤器,这个过滤器会应用到该路由上,并使用默认的配置。
- 编写过滤器:根据需要,编写全局过滤器和网关过滤器来实现网关鉴权逻辑。
 
// 全局过滤器
@Component
public class AuthGlobalFilter implements GlobalFilter {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 在此处进行身份验证和权限检查逻辑// 如果身份验证失败或者权限不足,则直接返回未授权的响应// 否则,继续执行后续的过滤器和路由处理逻辑HttpHeaders headers = exchange.getRequest().getHeaders();String token = headers.getFirst("Authorization");if (token == null || !token.equals("valid_token")) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);}
}// 网关过滤器
@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {public AuthGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {// 在此处进行定制化的鉴权逻辑// 可以根据请求信息和配置进行权限验证等操作// 如果鉴权失败,则直接返回未授权的响应// 否则,继续执行后续的过滤器和路由处理逻辑ServerHttpRequest request = exchange.getRequest();String token = request.getHeaders().getFirst("Authorization");if (token == null || !token.equals("valid_token")) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);};}public static class Config {// 可以在这里定义一些配置属性,用于定制化过滤器的行为}
}
 
在这个示例中,我们编写了一个全局过滤器AuthGlobalFilter和一个网关过滤器AuthGatewayFilterFactory,它们分别实现了网关鉴权的逻辑。
- 注册过滤器:SpringBoot应用会自动扫描@Component注解,将其注册为 Spring
Bean,因此不需要额外的注册步骤。这意味着上面的过滤器会在应用启动时自动注册到Spring Cloud Gateway中。 - 启动应用程序:在SpringBoot应用中,启动应用程序非常简单,只需要运行主应用程序类即可。
 
@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}
 
通过这些步骤,我们可以简单实现网关鉴权功能,并确保其在Spring Cloud Gateway中生效。
GlobalFilter 是什么?
GlobalFilter是Spring Cloud Gateway中的一个全局过滤器接口,用于处理所有进入网关的请求。全局过滤器在请求进入网关之后,在路由之前执行,因此可以对所有的请求进行统一的处理,如日志记录、认证、权限校验等。
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class LoggingGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求信息并进行日志记录System.out.println("Request Path: " + exchange.getRequest().getPath());return chain.filter(exchange);}@Overridepublic int getOrder() {return -1; // 设置过滤器的执行顺序,负数代表早于默认的过滤器执行}
}
 
在这个示例中,我们创建了一个名为LoggingGlobalFilter的全局过滤器,它实现了GlobalFilter接口。在filter方法中,我们获取了请求的路径并记录日志,然后调用了chain.filter(exchange)方法,以便请求继续执行后续的过滤器和路由处理逻辑。通过getOrder方法,我们设置了过滤器的执行顺序,使其早于默认的过滤器执行。
GatewayFilter 是什么?
GatewayFilter是Spring Cloud Gateway中的一个网关过滤器接口,用于对特定的路由进行定制化的处理。每个路由可以配置一组网关过滤器,用于对请求进行特定的处理,如认证、鉴权、请求修改等。
import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class AuthGatewayFilterFactory extends AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config> {public AuthGatewayFilterFactory() {super(Config.class);}@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {// 在此处进行鉴权逻辑if (!isAuthorized(exchange)) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}return chain.filter(exchange);};}private boolean isAuthorized(ServerWebExchange exchange) {// 在这里进行鉴权逻辑,判断请求是否合法// 如果合法返回true,否则返回falsereturn true;}public static class Config {// 可以在这里定义一些配置属性,用于定制化过滤器的行为}
}
 
在这个示例中,我们创建了一个名为AuthGatewayFilterFactory的网关过滤器,它继承自AbstractGatewayFilterFactory<AuthGatewayFilterFactory.Config>类,并实现了apply方法。在apply方法中,我们进行了鉴权逻辑的处理,如果请求不合法,则返回未授权的响应;否则,调用chain.filter(exchange)方法,继续执行后续的过滤器和路由处理逻辑。通过Config类,我们可以定义一些配置属性,用于定制化过滤器的行为。
综上所述,通过Spring Cloud Gateway提供的过滤器机制,我们可以轻松实现灵活而强大的网关鉴权功能,确保系统的安全性和可靠性。
相关文章:
什么是网关鉴权及其在Spring Cloud Gateway中的实现
在现代微服务架构中,网关扮演着非常重要的角色,它是系统和外部世界之间的入口,负责路由请求、流量控制以及安全保护等任务。其中,网关鉴权是保障系统安全的重要环节之一。本文将深入介绍什么是网关鉴权,以及如何通过过…...
【机器学习与实现】支持向量机SVM
目录 一、SVM (Support Vector Machine) 概述(一)支持向量机SVM的主要特点(二)支持向量与间隔最大化(三)线性可分/不可分(四)软间隔 (soft margin) 与核技巧 (kernel trick)…...
当代人工智能三教父——深度学习三巨头
文章目录 引言 人物介绍 突出贡献 专业名词解释 引言 今天下午闲来无事翻阅了一下csdn首页的头条文章——《27 岁天才创始人 Joel Hellermark 分享了自己和“AI 教父” Geoffery Hinton 的最新采访》 感觉挺有意思,就从头到尾的看了一遍,里面有很多…...
Django项目从创建到开发以及数据库连接的主要步骤,精简实用
1、项目创建 安装命令:pip install django3 -i <https://pypi.tuna.tsinghua.edu.cn/simple>上述命令是使用清华镜像,安装django3在项目的创建目录执行命令:django-admin startproject 项目名称(英文)就可以在指…...
linux 命令 grep 排除 No such file or directory
du -sh * 2>&1 | grep -v "proc" command 2>&1 | grep -v "No such file or directory" 这里的 2>&1 是将错误输出重定向到标准输出,然后 grep -v "No such file or directory" 会过滤掉包含 &qu…...
Unity 滑动条(Slider)拖拽开始和结束、点击等事件的拓展功能
目录 前言 一、关于slider的监听事件 二、方案一 (无脚本版) 三、方案二 (继承slider脚本进行拓展) 四、方案三(外部脚本添加) 前言 前一段时间在使用这个功能,发现搜索出来的文章和脚本&…...
Linux 学习知识 (简单易懂 )持续更新 Linux输出重定向 Linux通配符 Linux正则表达式 持续更新....
一.输出重定向 标准输出:是将信息输出在终端 标准错误输出:在执行命令的过程中所产生错误信息也是输出在终端标准输入:从键盘输入 1.1标准输出重定向 作用:将本来要显示在终端上的信息重定向到一个文件中 实现方法:…...
前端vue用el-table如何实现表头内容过长换行处理,实现换行效果
前端vue用el-table如何实现表头内容过长换行处理,实现换行效果 这是效果图 有两种方法,一种简易版本,一种万能方法,都是el-table,先看文档 表头标题是可以自定义的 方法一 label的解释写在代码里面了,这里会自动形成换…...
15:00面试,15:08出来,面试问的有点变态。。。。
🍅 视频学习:文末有免费的配套视频可观看 🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天…...
【BUG】流式响应requests得到: ping - 和时间戳
前情提要 运行Langchain-Chatchat项目,使用自定义请求访问API Server流式输出 报错展示 b: ping - 2024-05-22 00:46:04.83252000:00\r\n\r\n报错原因 这通常是由于 Server-Sent Events (SSE) 实现中使用的“心跳”机制,以确保连接保持活跃。一些 SSE…...
人工智能应用-实验5-BP 神经网络分类手写数据集
文章目录 🧡🧡实验内容🧡🧡🧡🧡代码🧡🧡🧡🧡分析结果🧡🧡🧡🧡实验总结🧡🧡 ǹ…...
K8s Pod 资源进阶
文章目录 K8s Pod 资源进阶pod 资源限制限制资源单位 资源限制实战Pod 服务质量QosDownward API可注入的元数据信息环境变量方式注入元数据存储卷方式注入元数据为注册服务注入Pod 名称为 JVM 注入堆内存限制 K8s Pod 资源进阶 pod 资源限制 资源限制的方法: Req…...
掌握Edge浏览器的使用技巧
导言: Edge浏览器是微软推出的一款现代化、高效的网络浏览器。它不仅提供了基本的浏览功能,还具备了许多强大的特性和技巧,可以帮助用户更好地利用浏览器进行工作和娱乐。本文将介绍一些Edge浏览器的使用技巧,帮助读者更好地掌握这…...
Qt封装ping命令并将ping结果显示到界面
实现界面及在Windows 10下的运行结果如下: 代码如下: pingNetWork.h // 检测网络是否ping通的工具#ifndef PINGNETWORK_H #define PINGNETWORK_H#include <QWidget> #include"control_global.h" namespace Ui { class CPingNetWork; }c…...
图论(洛谷刷题)
目录 前言: 题单: P3386 【模板】二分图最大匹配 P1525 [NOIP2010 提高组] 关押罪犯 P3385 【模板】负环 P3371 【模板】单源最短路径(弱化版) SPFA写法 Dij写法: P3385 【模板】负环 P5960 【模板】差分约束…...
安卓部署ffmpeg全平台so并实现命令行调用
安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so 第四章 部署ffmpeg安卓全平台so并使用(本章) 文章目录 安卓 FFmpeg系列前言一、添加so1、拷贝ffmpeg到项目2、bu…...
Go语言中MD5盐值加密解决用户密码问题
1. 用户密码存储的挑战 在Web应用开发中,用户密码的安全存储是一个核心问题。明文存储用户密码是极其危险的,因为一旦数据库被泄露,攻击者就可以直接获取用户的密码。为了保护用户密码,我们需要采取加密措施。 2. MD5算法简介 …...
flutter开发实战-本地SQLite数据存储
flutter开发实战-本地SQLite数据库存储 正在编写一个需要持久化且查询大量本地设备数据的 app,可考虑采用数据库。相比于其他本地持久化方案来说,数据库能够提供更为迅速的插入、更新、查询功能。这里需要用到sqflite package 来使用 SQLite 数据库 预…...
【路由組件】
完成Vue Router 安装后,就可以使用路由了,路由的基本使用步骤,首先定义路由组件,以便使用Vue Router控制路由组件展示与 切换,接着定义路由链接和路由视图,以便告知路由组件渲染到哪个位置,然后…...
【C++风云录】数字逻辑设计优化:电子设计自动化与集成电路
集成电路设计:打开知识的大门 前言 本文将详细介绍关于数字芯片设计,电子设计格式解析,集成电路设计工具,硬件描述语言分析,电路验证以及电路优化六个主题的深入研究与实践。每一部分都包含了主题的概述,…...
深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
离线语音识别方案分析
随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...
