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

什么是网关鉴权及其在Spring Cloud Gateway中的实现

在现代微服务架构中,网关扮演着非常重要的角色,它是系统和外部世界之间的入口,负责路由请求、流量控制以及安全保护等任务。其中,网关鉴权是保障系统安全的重要环节之一。本文将深入介绍什么是网关鉴权,以及如何通过过滤器来实现网关鉴权,同时探讨如何利用Spring Cloud Gateway来实现这一目标。

什么是网关鉴权?

网关鉴权是指在请求到达系统之前对请求进行身份验证和授权的过程。通常包括两个主要方面:

  1. 身份验证:验证请求的发起者的身份是否合法,通常涉及用户的认证,确认其身份是否在系统中注册并且具有相应的权限。

  2. 授权:确定请求发起者是否有权限访问所请求的资源,即对请求进行权限验证,保证用户只能访问其有权限的资源。

如何通过过滤器来实现网关鉴权?

在Spring Cloud Gateway中,可以通过自定义过滤器来实现网关鉴权。过滤器是一种处理HTTP请求的机制,可以在请求到达网关之前或者之后执行一些操作。在网关鉴权中,我们主要关注两种过滤器:GlobalFilter和 GatewayFilter。

  1. 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);}
}
  1. 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提供了丰富的功能和灵活的扩展机制,使得网关鉴权变得简单而又强大。下面是一些实现网关鉴权的步骤:

  1. 配置路由规则:首先需要配置路由规则,指定请求应该如何被路由到后端服务。
spring:cloud:gateway:routes:- id: service-routeuri: http://localhost:8081predicates:- Path=/service/**filters:- name: Authargs:config:# 可以在这里配置过滤器的行为

在这个示例中,我们配置了一个名为service-route的路由,将所有路径以/service/开头的请求路由到http://localhost:8081这个后端服务。并且我们通过filters属性指定了名为Auth的过滤器,这个过滤器会应用到该路由上,并使用默认的配置。

  1. 编写过滤器:根据需要,编写全局过滤器和网关过滤器来实现网关鉴权逻辑。
// 全局过滤器
@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,它们分别实现了网关鉴权的逻辑。

  1. 注册过滤器:SpringBoot应用会自动扫描@Component注解,将其注册为 Spring
    Bean,因此不需要额外的注册步骤。这意味着上面的过滤器会在应用启动时自动注册到Spring Cloud Gateway中。
  2. 启动应用程序:在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中的实现

在现代微服务架构中&#xff0c;网关扮演着非常重要的角色&#xff0c;它是系统和外部世界之间的入口&#xff0c;负责路由请求、流量控制以及安全保护等任务。其中&#xff0c;网关鉴权是保障系统安全的重要环节之一。本文将深入介绍什么是网关鉴权&#xff0c;以及如何通过过…...

【机器学习与实现】支持向量机SVM

目录 一、SVM (Support Vector Machine) 概述&#xff08;一&#xff09;支持向量机SVM的主要特点&#xff08;二&#xff09;支持向量与间隔最大化&#xff08;三&#xff09;线性可分/不可分&#xff08;四&#xff09;软间隔 (soft margin) 与核技巧 (kernel trick)&#xf…...

当代人工智能三教父——深度学习三巨头

文章目录 引言 人物介绍 突出贡献 专业名词解释 引言 今天下午闲来无事翻阅了一下csdn首页的头条文章——《27 岁天才创始人 Joel Hellermark 分享了自己和“AI 教父” Geoffery Hinton 的最新采访》 感觉挺有意思&#xff0c;就从头到尾的看了一遍&#xff0c;里面有很多…...

Django项目从创建到开发以及数据库连接的主要步骤,精简实用

1、项目创建 安装命令&#xff1a;pip install django3 -i <https://pypi.tuna.tsinghua.edu.cn/simple>上述命令是使用清华镜像&#xff0c;安装django3在项目的创建目录执行命令&#xff1a;django-admin startproject 项目名称&#xff08;英文&#xff09;就可以在指…...

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 是将错误输出重定向到标准输出&#xff0c;然后 grep -v "No such file or directory" 会过滤掉包含 &qu…...

Unity 滑动条(Slider)拖拽开始和结束、点击等事件的拓展功能

目录 前言 一、关于slider的监听事件 二、方案一 &#xff08;无脚本版&#xff09; 三、方案二 &#xff08;继承slider脚本进行拓展&#xff09; 四、方案三&#xff08;外部脚本添加&#xff09; 前言 前一段时间在使用这个功能&#xff0c;发现搜索出来的文章和脚本&…...

Linux 学习知识 (简单易懂 )持续更新 Linux输出重定向 Linux通配符 Linux正则表达式 持续更新....

一.输出重定向 标准输出&#xff1a;是将信息输出在终端 标准错误输出&#xff1a;在执行命令的过程中所产生错误信息也是输出在终端标准输入&#xff1a;从键盘输入 1.1标准输出重定向 作用&#xff1a;将本来要显示在终端上的信息重定向到一个文件中 实现方法&#xff1a…...

前端vue用el-table如何实现表头内容过长换行处理,实现换行效果

前端vue用el-table如何实现表头内容过长换行处理&#xff0c;实现换行效果 这是效果图 有两种方法&#xff0c;一种简易版本&#xff0c;一种万能方法,都是el-table&#xff0c;先看文档 表头标题是可以自定义的 方法一 label的解释写在代码里面了&#xff0c;这里会自动形成换…...

15:00面试,15:08出来,面试问的有点变态。。。。

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天…...

【BUG】流式响应requests得到: ping - 和时间戳

前情提要 运行Langchain-Chatchat项目&#xff0c;使用自定义请求访问API Server流式输出 报错展示 b: ping - 2024-05-22 00:46:04.83252000:00\r\n\r\n报错原因 这通常是由于 Server-Sent Events (SSE) 实现中使用的“心跳”机制&#xff0c;以确保连接保持活跃。一些 SSE…...

人工智能应用-实验5-BP 神经网络分类手写数据集

文章目录 &#x1f9e1;&#x1f9e1;实验内容&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;代码&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;分析结果&#x1f9e1;&#x1f9e1;&#x1f9e1;&#x1f9e1;实验总结&#x1f9e1;&#x1f9e1; &#x1f9…...

K8s Pod 资源进阶

文章目录 K8s Pod 资源进阶pod 资源限制限制资源单位 资源限制实战Pod 服务质量QosDownward API可注入的元数据信息环境变量方式注入元数据存储卷方式注入元数据为注册服务注入Pod 名称为 JVM 注入堆内存限制 K8s Pod 资源进阶 pod 资源限制 资源限制的方法&#xff1a; Req…...

掌握Edge浏览器的使用技巧

导言&#xff1a; Edge浏览器是微软推出的一款现代化、高效的网络浏览器。它不仅提供了基本的浏览功能&#xff0c;还具备了许多强大的特性和技巧&#xff0c;可以帮助用户更好地利用浏览器进行工作和娱乐。本文将介绍一些Edge浏览器的使用技巧&#xff0c;帮助读者更好地掌握这…...

Qt封装ping命令并将ping结果显示到界面

实现界面及在Windows 10下的运行结果如下&#xff1a; 代码如下&#xff1a; pingNetWork.h // 检测网络是否ping通的工具#ifndef PINGNETWORK_H #define PINGNETWORK_H#include <QWidget> #include"control_global.h" namespace Ui { class CPingNetWork; }c…...

图论(洛谷刷题)

目录 前言&#xff1a; 题单&#xff1a; P3386 【模板】二分图最大匹配 P1525 [NOIP2010 提高组] 关押罪犯 P3385 【模板】负环 P3371 【模板】单源最短路径&#xff08;弱化版&#xff09; SPFA写法 Dij写法&#xff1a; P3385 【模板】负环 P5960 【模板】差分约束…...

安卓部署ffmpeg全平台so并实现命令行调用

安卓 FFmpeg系列 第一章 Ubuntu生成ffmpeg安卓全平台so 第二章 Windows生成ffmpeg安卓全平台so 第三章 生成支持x264的ffmpeg安卓全平台so 第四章 部署ffmpeg安卓全平台so并使用&#xff08;本章&#xff09; 文章目录 安卓 FFmpeg系列前言一、添加so1、拷贝ffmpeg到项目2、bu…...

Go语言中MD5盐值加密解决用户密码问题

1. 用户密码存储的挑战 在Web应用开发中&#xff0c;用户密码的安全存储是一个核心问题。明文存储用户密码是极其危险的&#xff0c;因为一旦数据库被泄露&#xff0c;攻击者就可以直接获取用户的密码。为了保护用户密码&#xff0c;我们需要采取加密措施。 2. MD5算法简介 …...

flutter开发实战-本地SQLite数据存储

flutter开发实战-本地SQLite数据库存储 正在编写一个需要持久化且查询大量本地设备数据的 app&#xff0c;可考虑采用数据库。相比于其他本地持久化方案来说&#xff0c;数据库能够提供更为迅速的插入、更新、查询功能。这里需要用到sqflite package 来使用 SQLite 数据库 预…...

【路由組件】

完成Vue Router 安装后&#xff0c;就可以使用路由了&#xff0c;路由的基本使用步骤&#xff0c;首先定义路由组件&#xff0c;以便使用Vue Router控制路由组件展示与 切换&#xff0c;接着定义路由链接和路由视图&#xff0c;以便告知路由组件渲染到哪个位置&#xff0c;然后…...

【C++风云录】数字逻辑设计优化:电子设计自动化与集成电路

集成电路设计&#xff1a;打开知识的大门 前言 本文将详细介绍关于数字芯片设计&#xff0c;电子设计格式解析&#xff0c;集成电路设计工具&#xff0c;硬件描述语言分析&#xff0c;电路验证以及电路优化六个主题的深入研究与实践。每一部分都包含了主题的概述&#xff0c;…...

java_网络服务相关_gateway_nacos_feign区别联系

1. spring-cloud-starter-gateway 作用&#xff1a;作为微服务架构的网关&#xff0c;统一入口&#xff0c;处理所有外部请求。 核心能力&#xff1a; 路由转发&#xff08;基于路径、服务名等&#xff09;过滤器&#xff08;鉴权、限流、日志、Header 处理&#xff09;支持负…...

Leetcode 3576. Transform Array to All Equal Elements

Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接&#xff1a;3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到&#xf…...

Qt Http Server模块功能及架构

Qt Http Server 是 Qt 6.0 中引入的一个新模块&#xff0c;它提供了一个轻量级的 HTTP 服务器实现&#xff0c;主要用于构建基于 HTTP 的应用程序和服务。 功能介绍&#xff1a; 主要功能 HTTP服务器功能&#xff1a; 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

如何理解 IP 数据报中的 TTL?

目录 前言理解 前言 面试灵魂一问&#xff1a;说说对 IP 数据报中 TTL 的理解&#xff1f;我们都知道&#xff0c;IP 数据报由首部和数据两部分组成&#xff0c;首部又分为两部分&#xff1a;固定部分和可变部分&#xff0c;共占 20 字节&#xff0c;而即将讨论的 TTL 就位于首…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 &#x1f4dd; 在上一篇文章中&#xff0c;我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源&#xff0c;方便后续将资源打包到一个可执行文件中。 2.embed介绍 &#x1f3af; Go 1.16 引入了革命性的 embed 包&#xff0c;彻底改变了静态资源管理的…...

Mysql中select查询语句的执行过程

目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析&#xff08;Parser&#xff09; 2.4、执行sql 1. 预处理&#xff08;Preprocessor&#xff09; 2. 查询优化器&#xff08;Optimizer&#xff09; 3. 执行器…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲

文章目录 前言第一部分&#xff1a;体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分&#xff1a;体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...

C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)

名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...