SpringCloudGateway之统一鉴权篇

SpringCloudGateway之统一鉴权篇

SpringCloudGateway实现统一鉴权的方式

基于JWT(JSON Web Token)

在客户端登录成功后,服务端生成一个包含用户信息和过期时间等数据的JWT令牌返回给客户端。
客户端在后续请求中将此令牌放在请求头(如Authorization: Bearer token)中发送给网关。
网关层通过自定义的GatewayFilter Factory来拦截所有请求,并检查请求头中的JWT令牌,使用对应的解码器对其进行解密和校验,包括但不限于签名验证、过期时间检查等。

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class JwtAuthenticationGatewayFilterFactory extends AbstractGatewayFilterFactory<JwtAuthenticationGatewayFilterFactory.Config> {@Overridepublic GatewayFilter apply(Config config) {return (exchange, chain) -> {ServerHttpRequest request = exchange.getRequest();String jwtToken = getTokenFromRequest(request);// 假设我们有一个JwtService类来处理验证逻辑JwtService jwtService = new JwtService();if (jwtService.isTokenValid(jwtToken)) {return chain.filter(exchange);} else {return unauthorizedResponse(exchange);}};}private Mono<Void> unauthorizedResponse(ServerWebExchange exchange) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}private String getTokenFromRequest(ServerHttpRequest request) {// 从请求头中获取JWT令牌return request.getHeaders().getFirst("Authorization").replace("Bearer ", "");}// 配置类可选,根据需要添加配置参数public static class Config {// 示例配置项,实际应用可能不需要// private String headerName;// ...}
}
  • yaml配置
spring:cloud:gateway:routes:- id: users-service-routeuri: lb://users-servicepredicates:- Path=/api/users/**filters:- name: JwtAuthentication # 自定义过滤器名称# 如果有配置项,则可以在这里传入

集成OAuth2授权服务器

Spring Cloud Gateway与OAuth2授权服务器(如Keycloak、Spring Authorization Server等)结合,处理OAuth2的访问令牌(Access Token)和刷新令牌(Refresh Token)的验证。
当接收到带有令牌的请求时,网关可以调用授权服务器的/oauth/check_token端点或其他方式进行令牌的有效性验证。

配置Oauth2资源服务器:

首先需要有一个独立的OAuth2授权服务器,用于处理用户的登录、发放令牌(如JWT)等授权流程。
在各个微服务应用中配置自己为Oauth2资源服务器,通过spring-security-oauth2-resource-server模块来保护资源,并验证从Gateway传递过来的访问令牌的有效性。

配置Spring Cloud Gateway:

添加必要的依赖项,集成Spring Security与OAuth2客户端支持。
在Gateway的配置文件中设置路由规则,指定哪些路由需要经过OAuth2的过滤器进行鉴权。
配置OAuth2的客户端信息,以便向授权服务器请求令牌验证信息。
使用spring-cloud-starter-gateway 和 spring-security-oauth2-client 等相关依赖并配置Gateway路由过滤器,例如添加 OAuth2AuthorizationCodeGrantFilter 或 OAuth2LoginFilter 用于处理用户身份认证。

路由规则及鉴权过滤器:

定义路由规则,比如:

yamlgateway:routes:- id: oauth2-api-routeuri: lb://your-microservice-name # 路由到的实际服务地址predicates:- Path=/api/** # 匹配特定路径的请求filters:- name: OAuth2Authorization Bearer Token Relay # 或者其他适合的过滤器名称,用于转发令牌到下游服务
令牌验证与权限控制:

当请求到达Gateway时,带有OAuth2令牌的请求将被特定的过滤器拦截,过滤器会验证令牌的有效性。
如果令牌有效,则允许请求继续通过Gateway路由至相应的微服务;如果无效,则返回未授权错误。

基于API Gateway层面的过滤器实现

创建自定义的GatewayFilter Factory,根据需要设计并实现自己的鉴权逻辑,比如检查请求头中的特定字段、查询参数或Cookie等。
如果是微服务架构,还可以利用服务间通信机制,向认证服务发起请求以进行用户身份和权限的验证。

  • 创建自定义过滤器

创建一个继承org.springframework.cloud.gateway.filter.GatewayFilter或实现org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory的类,并在其内部实现鉴权逻辑。

import org.springframework.cloud.gateway.filter.GatewayFilter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;@Component
public class CustomAuthorizationFilter implements GatewayFilter, Ordered {@Overridepublic Mono<Void> filter(ServerHttpRequest request, ServerHttpResponse response, GatewayFilterChain chain) {// 从请求头或其他位置获取Token信息String token = getTokenFromRequest(request);// 验证Token有效性(这里只是一个示例,实际验证逻辑需要根据OAuth2服务器的接口和规范进行)if (isValidToken(token)) {return chain.filter(request);} else {// Token无效时返回401 Unauthorizedresponse.setStatusCode(HttpStatus.UNAUTHORIZED);return response.setComplete();}}private boolean isValidToken(String token) {// 实现你的Token验证逻辑,可能需要向OAuth2授权服务器发送请求验证Token// ...return true; // 假设此处验证通过}private String getTokenFromRequest(ServerHttpRequest request) {// 获取请求中的Token,比如从Authorization Header中提取Bearer Tokenreturn request.getHeaders().getFirst("Authorization").replace("Bearer ", "");}@Overridepublic int getOrder() {// 设置过滤器执行顺序,可以根据需求调整return -100;}
}
  • 注册过滤器到路由规则
spring:cloud:gateway:routes:- id: secured_routeuri: lb://your-service-idpredicates:- Path=/secured/**filters:- name: CustomAuthorizationFilter

配合Spring Security OAuth2

将Spring Security OAuth2与Spring Cloud Gateway整合,配置OAuth2资源服务器支持,使得网关可以直接处理已验证过的请求,或者在转发请求前进行进一步的权限验证。

首先,需要在pom.xml文件中添加以下依赖:
xml
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency><dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-client</artifactId>
</dependency>
在application.yml文件中,配置OAuth2客户端的相关信息:
yaml
spring:cloud:gateway:routes:- id: my_routeuri: http://localhost:8081predicates:- Path=/api/**filters:- OAuth2ClientAuthenticationProcessingFilterspring:security:oauth2:client:registration:my_client:client-id: 123456client-secret: abcdefauthorization-grant-type: authorization_coderedirect-uri: http://localhost:8080/login/oauth2/code/my_clientscope: read,writeprovider:my_provider:authorization-endpoint: http://localhost:8089/oauth2/authorizetoken-endpoint: http://localhost:8089/oauth2/tokenuser-info-endpoint: http://localhost:8089/me
在代码中,实现OAuth2客户端的相关逻辑:
java
@Configuration
public class GatewayConfig {@Beanpublic RouterFunction<ServerResponse> route(OAuth2ClientAuthenticationProcessingFilter oauth2Filter) {return RouterFunctions.route(RequestPredicates.path("/api/**"), request -> {request.mutate().header(HttpHeaders.AUTHORIZATION, "Bearer " + getAccessToken(oauth2Filter)).build();return forward(request);});}private String getAccessToken(OAuth2ClientAuthenticationProcessingFilter oauth2Filter) {// 获取access token的逻辑// ...}private ServerResponse forward(ServerRequest request) {// 路由转发的逻辑// ...}
}

基于Redis或数据库存储的Token验证

对于非JWT类型的Token,可以在Redis或数据库中存储已签发的Token及其相关信息,在网关层从请求中提取Token并对比存储的信息进行有效性验证。

添加依赖

确保项目包含了Spring Cloud Gateway、Spring Security、OAuth2以及Spring Data Redis相关依赖。

<dependencies><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Spring Security & OAuth2 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.springframework.security.oauth.boot</groupId><artifactId>spring-security-oauth2-resource-server</artifactId></dependency><!-- Spring Data Redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis-reactive</artifactId></dependency>
</dependencies>
配置Redis Token Store

配置Spring Security使用Redis存储和检索JWT或其他类型Token的信息:

spring:security:oauth2:resourceserver:jwt:jwk-set-uri: http://your-oauth2-server.com/jwks # 如果是JWT,则配置公钥库地址issuer-uri: http://your-oauth2-server.com # JWT发行者地址oauth2:client:registration:your-client:# ... 客户端注册信息 ...provider:your-provider:# ... 授权服务器信息 ...resource:token-info-uri: http://your-oauth2-server.com/check_token # 可选,如果使用服务端校验Token(非JWT)redis:token-store: true # 开启Redis作为Token存储data:redis:port: 6379host: localhost
配置路由与过滤器

通过Gateway的路由规则指定哪些请求需要经过OAuth2认证,并使用内置或自定义过滤器处理Token验证。

spring:cloud:gateway:routes:- id: secured_routeuri: lb://your-service-idpredicates:- Path=/secured/**filters:- name: BearerTokenAuthenticationFilterargs:# ... 过滤器参数 ...
安全配置

启用资源服务器模式并配置从Redis读取Token信息的逻辑。

RBAC(Role-Based Access Control)权限控制

结合角色权限模型,在验证Token有效的同时,检查当前请求路径所要求的角色权限是否与用户持有的Token中声明的角色匹配。

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

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

相关文章

rviz上不显示机器人模型(模型只有白色)

文档中的是base_footprint&#xff0c;需要根据自己所设的坐标系更改&#xff0c;我的改为base_link 如何查看自己设的坐标系&#xff1a; 这些parent父坐标系就是 同时打开rviz后需要更改成base_link

Linux——使用Keepalived实现DHCP服务的高可用

前言 Keepalived是一个用于实现高可用性的开源工具&#xff0c;主要用于实现基于VRRP协议的负载均衡和故障转移功能。它可以通过检测节点的健康状况&#xff0c;并自动切换到备份节点来确保服务的高可用性。 Keepalived支持多种检测方式&#xff0c;如ping、TCP连接等&#x…

20232831 2023-2024-2 《网络攻防实践》第2次作业

目录 20232831 2023-2024-2 《网络攻防实践》第2次作业1.实验内容2.实验过程3.学习中遇到的问题及解决4.学习感悟、思考等参考资料 20232831 2023-2024-2 《网络攻防实践》第2次作业 1.实验内容 &#xff08;1&#xff09;从www.csdn.net、www.163.com等中选择一个DNS域名进行…

结构设计模式 - 组合设计模式 - JAVA

组合设计模式 一. 介绍二.代码示例2.1 定义Component2.2 定义Leaf2.3 定义Composite 三. 参考案例 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 一. 介绍 由不同的对象组合成一个…

[嵌入式系统-39]:龙芯1B 开发学习套件 -9-PMON的文件结构

目录 前言&#xff1a; 一、PMON-V1.1 目录结构 二、Targets目录的组成 前言&#xff1a; 参考&#xff1a;​​​​​​龙芯相关 - 心映真的空间 一、PMON-V1.1 目录结构 PMON-V1.1 目录结构 pmon的目录结构大致如下&#xff08;由linux工具tree生成&#xff09; |-- Tar…

OSI(Open Systems Interconnection)模型和TCP/IP模型

OSI模型 OSI模型是一个概念模型&#xff0c;由国际标准化组织&#xff08;ISO&#xff09;在1984年提出&#xff0c;用于促进不同系统间的通信互联。OSI模型将网络通信的过程分为七层&#xff0c;每一层都有其特定的功能&#xff0c;从下至上依次是&#xff1a; 物理层&#x…

【机器学习智能硬件开发全解】(四)—— 政安晨:嵌入式系统基本素养【后摩尔时代】

随着物联网、大数据、人工智能时代的到来&#xff0c;海量的数据分析、大量复杂的运算对CPU的算力要求越来越高。 CPU内部的大部分资源用于缓存和逻辑控制&#xff0c;适合运行具有分支跳转、逻辑复杂、数据结构不规则、递归等特点的串行程序。 在集成电路工艺制程将要达到极…

CMake 脚本命令(Scripting Commands)之find_package

使用find_package引入外部依赖包 本章节通过示例演示Cmake中find_package的用法。 注&#xff1a;所有教程均在linux系统下测试通过&#xff0c;如果是windows和mac系统&#xff0c;可能会出现错误&#xff0c;需要自行调试修改 通过Cmake内置模块引入依赖包 为了方便我们在…

Todesk与向日葵:哪款远程工具更胜一筹?

在数字化时代&#xff0c;远程工具已成为许多个人和企业不可或缺的一部分。其中&#xff0c;Todesk和向日葵是两款备受瞩目的远程桌面软件。它们各自拥有独特的功能和优势&#xff0c;但究竟哪一款更适合您的需求呢&#xff1f;本文将从稳定性、易用性、价格和安全性等方面对这…

一个H5页面中直接使用React的示例与说明

示例 如题&#xff0c;下面的个简单代码示例—在H5页面中直接使用React <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0&q…

Pytorch从零开始实战21

Pytorch从零开始实战——Pix2Pix理论与实战 本系列来源于365天深度学习训练营 原作者K同学 文章目录 Pytorch从零开始实战——Pix2Pix理论与实战内容介绍数据集加载模型实现开始训练总结 内容介绍 Pix2Pix是一种用于用于图像翻译的通用框架&#xff0c;即图像到图像的转换。…

【数学】【计算几何】1453. 圆形靶内的最大飞镖数量

作者推荐 视频算法专题 本文涉及知识点 数学 计算几何 LeetCoce:1453. 圆形靶内的最大飞镖数量 Alice 向一面非常大的墙上掷出 n 支飞镖。给你一个数组 darts &#xff0c;其中 darts[i] [xi, yi] 表示 Alice 掷出的第 i 支飞镖落在墙上的位置。 Bob 知道墙上所有 n 支飞…

【Maven 加速 下载】使用 | 阿里云 Maven 中央仓库

阿里云 Maven 中央仓库: 是 阿里云云效 提供的公共代理仓库。 优势: 相比于 Maven 中央仓库,下载更快,更稳定。 仓库地址: 仓库名称阿里云仓库地址阿里云仓库地址(老版)源地址centralhttps://maven.aliyun.com/repository/centralhttps://maven.aliyun.com/nexus/content/…

分布式之网关Gateway

Spring Cloud Gateway 1、网关简介 网关作为流量的入口&#xff0c;常用的功能包括路由转发&#xff0c;权限校验&#xff0c;限流等。 2、Gateway简介 Spring Cloud Gateway 是Spring Cloud官方推出的第二代网关框架&#xff0c;定位于取代 Netflix Zuul。相比 Zuul 来说&…

抖音在线点赞任务发布接单运营平台PHP网站源码

源码简介 抖音在线点赞任务发布接单运营平台PHP网站源码 多个支付通道分级会员制度 介绍&#xff1a; 1、三级代理裂变&#xff0c;静态返佣/动态返佣均可设置。&#xff08;烧伤制度&#xff09;。 2、邀请二维码接入防红跳转。 3、自动机器人做任务&#xff0c;任务时间…

【安卓与苹果区别】详细讲解

安卓和苹果 安卓(Android)和苹果(Apple)在移动操作系统和智能手机市场是两个主要的竞争对手。这里的“苹果”指的是苹果公司设计的iOS操作系统以及苹果自己生产的iPhone手机&#xff0c;而“安卓”是指谷歌开发的Android操作系统&#xff0c;它被多个手机制造商用于他们的设备…

软考高级:信息系统分类-业务处理系统(TPS)概念和例题

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

创新发展,探索智慧园区平台架构设计与实现

随着信息技术的快速发展&#xff0c;智慧园区平台作为集成物联网、大数据、人工智能等技术的综合性服务平台&#xff0c;正逐步成为推动企业数字化转型的重要驱动力。本文将深入探讨智慧园区平台的架构设计思路、关键技术和应用场景&#xff0c;助力读者了解如何打造智慧化、协…

C# 连接neo4j数据库,包括非默认的neo4j默认库

官方文档没找见&#xff0c;自己在源码里面找到的 private string _dbHost "bolt://localhost:7687"; private string _dbUser "neo4j"; private string _dbPassword "******"; private IDriver? _driver;public CQLOperation(string _data…

【微服务-Nacos】Nacos集群的工作原理及集群间数据同步过程

上篇文章我们介绍了Nacos集群的搭建方法及步骤&#xff0c;下面我们来看一下Nacos集群的工作原理&#xff0c;一共有两部分&#xff1a;Leader节点选举及各节点数据同步。 1、Nacos集群中Leader节点是如何产生的 Nacos集群采用了Raft算法实现。它是一种比较简单的选举算法&am…