权限校验是否应该在 Spring Cloud Gateway 中进行?

Spring Security集成Oauth2实现用户身份验证+授权 前言 最近的项目有使用到Sping Security和Oauth做用户身份验证和授权机制,所以在网上找了点资料简单学习并写了个小demo,在此进行记录总结。 参考链接 1. Spring Security了解:https://www.springcloud.cc/spring-security-zhcn.html 2. Spring Boot集成Spring Security: https://www.jianshu.com/p/afe6619d9663 https://www.cnblogs. 阅读详情

这是一个非常关键且常见的架构问题!“权限校验是否应该在 Spring Cloud Gateway 中进行?” 答案是:部分可以,但要分场景,不能一概而论。

下面我们从合理性、适用场景、风险与最佳实践几个维度来深入分析:


一、为什么有人想在 Gateway 做权限校验?

✅ 优势(合理之处)

优势说明
统一入口,避免重复所有请求经过网关,认证逻辑只需写一次
提前拦截,节省资源无效请求(如未登录、Token 过期)在网关就被拒绝,不进入下游服务
解耦业务服务业务服务无需关心认证细节,专注核心逻辑
便于集中监控登录失败、非法访问等行为可在网关统一记录

🎯 适合场景:身份认证(Authentication),比如验证 JWT Token 是否有效、是否过期。


二、为什么不能把所有权限校验都放在 Gateway?

❌ 核心问题:权限 ≠ 认证

  • 认证(Authentication):你是谁?(验证身份)→ ✅ 适合在 Gateway
  • 授权(Authorization):你能做什么?(验证权限)→ ❌ 通常不适合在 Gateway

⚠️ 在 Gateway 做细粒度权限校验的风险

问题详细说明
业务耦合权限规则(如“只有部门经理能删除员工”)属于业务逻辑,放在网关会导致网关了解太多业务细节
数据依赖权限判断往往需要查询数据库(如用户角色、资源归属),网关不应直接访问业务数据库
维护困难每新增一个接口权限,都要修改网关配置或代码,违背“单一职责原则”
性能瓶颈网关变成“全能胶水层”,承担过多逻辑,影响高并发性能
测试复杂权限逻辑分散在网关和业务服务,难以单元测试和调试

🌰 举个例子

假设有一个接口:DELETE /api/employees/{id}

  • 认证:检查请求头是否有有效 Token → ✅ 可在 Gateway 做
  • 授权:检查当前用户是否是该员工的直属领导 → ❌ 必须在 员工服务(Employee Service) 中做,因为只有它知道组织架构关系

三、推荐的权限分层架构(最佳实践)

Token无效
Token有效
无权限
有权限
Client
Spring Cloud Gateway
认证检查
401 Unauthorized
下游微服务
权限检查
403 Forbidden
执行业务逻辑

🔐 分层职责明确

层级职责技术实现
Gateway 层粗粒度认证
• Token 格式校验
• 签名验证
• 是否过期
• 黑名单检查
• 自定义 GlobalFilter
• 集成 Spring Security OAuth2 Resource Server
业务服务层细粒度授权
• 角色/权限校验
• 数据级权限(如只能看自己部门)
• 业务规则校验
• Spring Security @PreAuthorize
• 自定义权限注解
• 服务内权限服务

四、Gateway 中如何安全地做认证?

✅ 推荐做法:只做 Token 有效性验证

// 示例:Gateway 中的认证过滤器(仅验证 JWT)
@Component
public class AuthFilter implements GlobalFilter, Ordered {

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String token = extractToken(exchange);
        
        if (token == null) {
            return unauthorized(exchange, "Missing token");
        }
        
        try {
            // 仅验证 Token 签名和过期时间(不查数据库!)
            JwtClaims claims = JwtHelper.parseToken(token, "secret-key");
            // 将用户信息放入 Header,传递给下游
            ServerHttpRequest request = exchange.getRequest().mutate()
                .header("X-User-Id", claims.getUserId())
                .header("X-User-Roles", String.join(",", claims.getRoles()))
                .build();
            return chain.filter(exchange.mutate().request(request).build());
        } catch (Exception e) {
            return unauthorized(exchange, "Invalid token");
        }
    }

    private Mono<Void> unauthorized(ServerWebExchange exchange, String msg) {
        exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
        return exchange.getResponse().setComplete();
    }

    @Override
    public int getOrder() {
        return -100; // 优先级高于路由过滤器
    }
}

🔑 关键点:

  • 不访问数据库:只做无状态验证(签名 + 过期时间)
  • 透传用户信息:将解析出的用户 ID、角色等放入 Header,供下游使用
  • 快速失败:无效 Token 直接返回 401,不转发请求

五、什么情况下可以在 Gateway 做简单授权?

虽然不推荐,但在以下特定场景可以谨慎使用:

场景说明示例
路由级权限某些路由只对特定角色开放/admin/** 仅允许 ADMIN 角色访问
黑白名单IP 或用户 ID 黑名单拦截恶意爬虫 IP 直接拒绝
功能开关某个功能模块临时关闭返回 403 并提示“功能维护中”

⚠️ 前提:这些规则简单、静态、不依赖业务数据,且可通过配置动态调整。


六、总结:权限校验的合理分工

功能是否适合在 Gateway建议位置
Token 有效性验证✅ 是Gateway
用户身份解析✅ 是(仅解析,不查库)Gateway
角色/权限校验❌ 否业务服务
数据级权限控制❌ 否业务服务
敏感操作二次验证❌ 否业务服务
IP/设备黑白名单✅ 是(简单规则)Gateway

💡 黄金法则:
Gateway 负责“你是谁”,业务服务负责“你能干什么”。

这样既能发挥网关的统一入口优势,又能保持微服务的内聚性和可维护性。

实战,Spring Cloud Gateway集成 RBAC 权限模型实现动态权限控制 以上五张表的SQL就不再详细贴出来了,都会放在案例源码的doc目录下,如下图: 设计思路 RBAC权限模型是基于角色的,因此在Spring Security中的权限就是角色,具体的认证授权流程如下: 用户登录申请令牌 通过UserDetailService查询、加载用户信息、比如密码、权限(角色)....封装到UserDetails中 令牌申请成功,携带令牌访问资源 网关层面比较访问的URL所需要的权限(Redis中)是否与当前令牌具备的权限有交集。有交集则表示具备访问该URL的权限... 阅读详情

相关推荐

微服务动态权限管理方案(Spring Cloud Gateway+Spring Cloud Security)

基于Spring Cloud Gateway和Spring Cloud Security的微服务用户动态权限管理方案

weixin_43349057的博客 2830

基于Scope的@PreAuthorize 配置计算机(服务)访问权限

JHipster_UAA 配置计算机(服务)访问权限          我们常常配置spring-security-oauth2,用来实现外部应用程序,可以使用我们的应用程序进行身份验证。但是在实际应用中,基于外部应用程序,客户端只能访问一部分用户允许的API.可用子集由OAuth Scopes确定.          Spring OAuth附带了

STRANGE-P 的博客 2021

实战!Spring Cloud Gateway集成 RBAC 权限模型实现动态权限控制

RBAC基于角色访问控制,目前使用最为广泛的权限模型。相信大家对这种权限模型已经比较了解了。此模型有三个用户、角色和权限,在传统的权限模型用户直接关联加了角色层,解耦了用户和权限,使得权限系统有了更清晰的职责划分和更高的灵活度。以上五张表的SQL就不再详细贴出来了,都会放在案例源码的doc本篇文章介绍了网关集成RBAC权限模型进行认证鉴权,核心思想就是将权限信息加载Redis缓存中,在网关层面的鉴权管理器中进行权限的校验,其中还整合了Restful风格的URL。

lt_xiaodou的博客 1466

Spring Security之服务器端方法级权限控制(八)

Spring Security之服务器端方法级权限控制(八)一、介绍1.概念2.三种级权限控制方法二、使用步骤1.导入jar依赖2.配置spring-security.xml3.在Controller类中添加注解 一、介绍 1.概念   在服务器端我们可以通过Spring security提供的注解对方法来进行权限控制。 2.三种级权限控制方法   Spring Security在方法的权限控制上支持三种类型的注解,JSR-250注解、@Secured注解和支持表达式的注解,这三种注解默认都是没有启用

sygg12345666的博客 263

微服务升级_SpringCloud Alibaba工作笔记0006---spring gateway工作流程

技术交流QQ群【JAVA,C++,Python,.NET,BigData,AI】:170933152 gateway的内容 gateway由三个部分组成, route路由:用来接收一个uri的 predict断言:就是一个Boolean类型,用来判断一个uri是否符合匹配规则 filter过滤:就是在这个请求,请求前和请求后,都可以对这个请求进行一些修改 可以看到网关在微服务中的位置 可以看到filter,可以在请求被路由前和路由后,对请求进行修改 可以看到上

添柴程序猿的专栏 515

ESP32Servo库驱动SG90舵机:从入门到精准控制

本文详细介绍了如何使用ESP32Servo库驱动SG90舵机,从硬件连接到软件环境搭建,再到编写示例程序实现精准控制。内容涵盖库安装、基础驱动代码解析、舵机校准方法以及平滑运动控制,帮助开发者快速掌握ESP32控制舵机的核心技能,并提供了电源管理、信号抗干扰等实用避坑指南。

ik678901的博客 895

Spring Security & OAuth2.0 & zuul & gateway 微服务鉴权全部流程笔记

一、基本概念 1、OAuth 一个认证协议。分布式常用的认证授权方案 2、认证 判断一个用户身份是否合法的过程,类似于我们平常说的登录 3、授权 用户认证通过后根据用户的权限来控制用户资源的过程。比如就算登录了微信,也不一定能进行微信支付,要检查有没有绑定银行卡,否则没有支付权限 1️⃣ 主体 一般指用户,也可以是程序,需要访问系统中的资源 2️⃣ 资源 分为系统功能资源和实体资源。实体资源由资源类型和资源实例组成 3️⃣权限 规定了用户对资源的操作许可 4、会话 为了避免用户每次操作都进行认证,将用户的信

ancfl 1305

高效利用ChEMBL数据库:从靶点查询到活性数据处理的完整指南

本文提供了高效利用ChEMBL数据库的完整指南,从靶点查询到活性数据处理。详细介绍了靶点精准定位、高级过滤技巧、数据导出优化以及活性数据清洗、特征工程和可视化等实战技巧,帮助药物研发人员快速获取和处理生物活性数据,提升工作效率。

weixin_29278805的博客 791

springsecurity OAuth2.0(springboot集成springsecurity 以及springcloud集成springsecurity )

用户认证通过后,为了避免用户的每次操作都进行认证,将用户的信息保存在会话中。会话就是系统为了保持当前登录的用户的登录状态锁提供的机制。

qq_73182976的博客 2745

打造你自己的小程序容器 —— 一套能装得下整个未来的跨端技术!

摘要: 本文介绍了一种基于Capacitor框架开发的轻量级“小程序容器”解决方案——LapDrop。通过模拟微信小程序的运行逻辑(动态加载、原生能力调用、沙盒环境),LapDrop允许开发者自主构建跨平台(iOS/Android/Web)的小程序生态。其核心利用Capacitor的插件桥接机制,实现JS与原生功能的无缝调用,并支持浏览器调试与原生环境一致化。优势包括插件化架构、状态隔离、热更新及开放权限控制,适用于企业级模块化应用或开发者工具。未来计划扩展生命周期管理、远程加载等功能,目标成为开源的小程序

CangYuChenAi的博客 973

逆向实战:我是如何一步步解开美团外卖App的mtgsig3.0签名(附关键代码片段)

本文详细记录了逆向分析美团外卖App的mtgsig3.0签名算法的全过程,从抓包到算法还原,包括Java层和Native层的深度分析。通过Frida、IDA Pro等工具,揭示了签名生成的多层加密流程,并提供了关键代码片段。文章还探讨了逆向工程中的反调试对抗和签名时效性问题,为安全研究人员提供了宝贵的技术参考。

weixin_42530732的博客 860

springcloudgateway权限验证_Spring Cloud Gateway 之 Filter

简介网关经常需要对路由请求进行过滤,进行一些操作,如鉴权之后构造头部之类的,过滤的种类很多,如增加请求头、增加请求 参数 、增加响应头和断路器等等功能,这就用到了Spring Cloud Gateway 的 Filter。作用当我们有很多个服务时,比如下图中的user-service、goods-service、sales-service等服务,客户端请求各个服务的Api时,每个服务都需要做相同的...

weixin_39853892的博客 3029

Docker 与容器技术的未来:从 OCI 标准到 eBPF 的演进

OCI 的核心目标是创建一个开放的、厂商中立的容器技术标准。这意味着,只要一个容器镜像符合 OCI 镜像格式规范,它就可以在任何符合 OCI 运行时规范的容器运行时上运行。eBPF 是一种革命性的技术,它允许在 Linux 内核中安全地运行沙盒程序,而无需修改内核源代码或加载内核模块。这些程序可以注册到内核中的各种事件点(如网络包到达、系统调用、函数调用/返回),并在事件发生时执行自定义逻辑。核心思想是:在不将数据复制到用户空间的情况下,程序可以直接在内核中处理数据,极大地提高了效率和性能。

专栏 1381

Spring Cloud gateway 自定义过滤器GatewayFilter

package com.rk.unified.gateway.filter; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.clo.

qq_36069670的博客 495

《AgentScope-Java 深入浅出教程》第10章 RAG 知识检索

RAG(Retrieval-Augmented Generation,检索增强生成)是一种将信息检索与文本生成相结合的技术架构。它通过从外部知识库中检索相关文档,将检索到的信息作为上下文注入到语言模型的提示中,从而增强模型的回答质量。│ RAG 工作流程 ││ ││ 用户问题 向量检索 上下文增强 生成回答 ││ ▼ ││ │ A │ ││ ││ 1. 接收问题 ││ 2. 将问题转换为向量,在知识库中检索相似文档 ││ 3. 将检索到的文档作为上下文添加到提示词中 │。

步子哥的博客 460

组态王与SqlServer数据库交互总结

组态王可以与SqlServer、mysql、acess、oracle等数据库进行数据交互。 本文重点梳理了如何把组态王中的数据保存到SqlServer数据库中,并使用ADO控件对数据库中的数据进行查询。 一、数据存到SQL数据库 1.新建记录体 2、创建表格模板(用于创建数据库中的表格) 3、打开sqlserver,新建数据库 4、创建ODBC数据源 选择自己新建的数据库 5.使用SQLConnect函数连接数据库,SQLCraetTable函数用于在数据库中创建表格 6.使用

逍遥子的博客 2万+

springCloud-14 gateWay 统一鉴权

目录 一,统一鉴权 1.1 鉴权逻辑 1.2 代码实现 一,统一鉴权 内置的过滤器已经可以完成大部分的功能,但是对于企业开发的一些业务功能处理,还是需要我们自己 编写过滤器来实现的,那么我们一起通过代码的形式自定义一个过滤器,去完成统一的权限校验。 1.1 鉴权逻辑 开发中的鉴权逻辑: 当客户端第一次请求服务时,服务端对用户进行信息认证(登录) 认证通过,将用户信息进行加密形成token,返回给客户端,作为登录凭证 以后每次请求,客户端都携带认证的token 服...

阿涩的博客 3734

元数据治理实战:构建企业数据地图与血缘体系

元数据(Metadata)是描述数据的数据,是你能了解“数据是怎么来的”、“它是做什么的”、“能不能用”的基础信息。📌 举个例子:order_idstringods_order定义:平台内用户在订单系统中产生的唯一订单编号更新时间:每天凌晨 2 点,由 Airflow 调度任务生成所属人:张三(数据开发部)🔍 这些信息本身不直接参与计算,但它们是数据可管理、可追踪、可评估的基础。模块实战建议元数据类型技术 + 业务 + 操作元数据三类统一治理治理路径。

晴天彩虹雨的博客 290

Gateway网关-全局过滤器

全局过滤器 上一节学习的过滤器,网关提供了31种,但每一种过滤器的作用都是固定的。如果我们希望拦截请求,做自己的业务逻辑则没办法实现。 全局过滤器作用 全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样。区别在于GatewayFilter通过配置定义,处理逻辑是固定的;而GlobalFilter的逻辑需要自己写代码实现。 定义方式是实现GlobalFilter接口。 public interface GlobalFilter { /**

Leon_Jinhai_Sun的博客 1801

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Cloud之服务入口Gateway的介绍和使用

详细介绍Gateway和Gateway的使用。

. 1万+

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Spring cloud gateway 详解和配置使用(文章较长)

目录 spring cloud gateway 介绍 1. 网关是怎么演化来的 2. 网关的基本功能 3.关于Spring Cloud Gateway 4.Spring Cloud Gateway 功能特征 5.predicate简介 6.GatewayFilter 工厂介绍 7.集成Hystrix的断路器功能 8.请求限流 pom.xml application.ym...

荡漾 21万+

spring cloud gateway权限校验

spring cloud gateway权限校验可以整合security实现,我这里采用自定义filter简单实现,步骤如下: 1.首先配置RouteLocator,贴代码 @Configuration public class GatewayRoutes { @Autowired private TokenGatewayFilter tokenGatewayFilter; @B...

5354

Spring Cloud笔记(5)Spring Cloud Gateway与权限认证

上一篇中,我们构建了一个简单的Spring Cloud Demo项目,涵盖了服务注册/发现,服务间的相互调用,以及熔断降级等内容。但如果服务需要暴露给外部进行使用,比如移动端,或者web端,则还需要考虑更多的事情。整个服务端的部署情况对于外部调用方应该是一个黑盒,外部调用方无法了解到每个服务具体是部署到哪一个IP或者域名下面,为了安全性也不太可能允许外部调用方直接连接到Consul去查询服务注册的...

weixin_46628206的博客 5694

spring cloud gateway 权限校验

编写自定义的权限校验代码,并且使该过滤器在指定的路由上生效即可 如果权限校验需要使用到redis,则在gateway中需要引入redis的依赖 自定义token权限校验代码 /** * @calssName AppTokenFilter * @Description 验证路由到APP用户端的接口是否有token * @Author jiangshaoneng * @DATE 2020/9/25 14:39 */ public class AppTokenFilter implements Ga.

放码过来 3843

【Spring Cloud】Gateway

API网关、Gateway Filter Factories

每篇博客都不是最终版,都会随着我的学习更新 1865

Spring Cloud Gateway

API网关也是一个服务,通常是后端服务的唯一入口. 它的定义类似于设计模式中的Facade模式(门面模式).也就是说,API网关就是整个微服务架构的门面,所有外部客户端访问,都需要经过它来进行调度和过滤网关的核心功能权限控制: 作为微服务的入口,对用户进行权限校验,如果拦截失败则进行拦截动态路由: 一切请求先经过网关,但网关不处理业务,只是通过某种规则,把请求转发到某个微服务负载均衡:当路由的目标有多个的时候,需要负载均衡。

m0_60963435的博客 1711
上一篇: 2、Nginx 与 Spring Cloud Gateway 详细对比:定位、场景与分工
下一篇: 2、auth-service 企业级代码目录结构规范
龙茶清欢
博客等级 码龄7年 3720粉丝 375原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

龙茶清欢

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值