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

Spring Cloud Gateway 怎么编写全局过滤器实现统一鉴权逻辑?

Spring Cloud Gateway 实现统一鉴权最标准的做法是实现 GlobalFilter 接口,将其注册为 Bean 后即可对所有路由生效。

先说结论:通过实现 GlobalFilter 接口并在 filter 方法中拦截请求,适合网关层统一校验 Token 或签名。

  • 适合全局限权场景
  • 需注意 Filter 执行顺序
  • 严禁阻塞操作
  • 需处理 OPTIONS 跨域请求

前置依赖

确保项目中包含 Spring Cloud Gateway 起步依赖。

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

完整代码实现

以下代码包含白名单放行、OPTIONS 请求处理、Token 校验及 JSON 错误响应写入,可直接参考使用。

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {// 白名单路径,无需鉴权private static final List<String> WHITE_LIST = Arrays.asList("/auth/login", "/actuator/health");@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String path = request.getPath().value();String method = request.getMethod().name();// 1. 放行白名单路径if (WHITE_LIST.stream().anyMatch(path::startsWith)) {return chain.filter(exchange);}// 2. 放行跨域预检请求if ("OPTIONS".equalsIgnoreCase(method)) {return chain.filter(exchange);}// 3. 获取 TokenString token = request.getHeaders().getFirst("Authorization");// 4. 校验逻辑 (此处替换为实际 JWT 校验)if (token == null || !token.startsWith("Bearer ")) {return unauthorized(exchange);}// 5. 鉴权通过,继续链路return chain.filter(exchange);}// 统一返回 401 JSON 错误private Mono<Void> unauthorized(ServerWebExchange exchange) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON);String body = "{\"code\":401,\"msg\":\"Unauthorized\"}";DataBufferFactory bufferFactory = exchange.getResponse().bufferFactory();DataBuffer dataBuffer = bufferFactory.wrap(body.getBytes(StandardCharsets.UTF_8));return exchange.getResponse().writeWith(Mono.just(dataBuffer));}@Overridepublic int getOrder() {// 优先级高于一般业务过滤器return -100;}
}

验证方法

1. 无 Token 请求测试

使用 curl 命令访问受保护接口,不带 Authorization 头,预期返回 401 状态码及 JSON body。

curl -i http://gateway-host/api/protected

2. 有 Token 请求测试

带上合法的 Token 请求,预期返回 200 状态码或后端服务的实际响应。

curl -i -H "Authorization: Bearer valid_token" http://gateway-host/api/protected

3. 跨域请求测试

发送 OPTIONS 请求,预期直接放行返回 200,不被鉴权拦截。

curl -i -X OPTIONS http://gateway-host/api/protected

常见坑与排查

1. 阻塞操作导致性能下降

GlobalFilter 运行在响应式线程池中,严禁在 filter 方法中进行同步阻塞操作(如 JDBC 查询、HTTP 同步请求)。如果需要调用外部鉴权服务,必须使用 WebClient 等异步客户端。

2. 响应体写入时机

在 WebFlux 中,一旦响应提交(setComplete),就不能再修改响应体。错误信息必须在 writeWith 中写入,并设置正确的 Content-Type 为 application/json。

3. 过滤器顺序冲突

如果项目中存在多个全局过滤器,顺序设置不当可能导致鉴权在日志记录之前执行。发现逻辑不生效时,优先检查 getOrder 返回值。

原文链接:https://www.zjcp.cc/ask/11338.html

http://www.jsqmd.com/news/834510/

相关文章:

  • 绍兴上门黄金回收 六大正规品牌 全域三区两市一县高价无套路变现 - 金掌柜黄金回收
  • 宁波黄金回收 全区域上门高价回收 正规无套路旧金变现全攻略 - 金掌柜黄金回收
  • 嘉兴黄金回收 全区域上门高价回收 正规无套路旧金变现全攻略 - 金掌柜黄金回收
  • 2026年5月投入式浊度仪十大主流品牌,工程选型必看 - 仪表品牌榜
  • 宝丰进口车膜门店横向测评:5家正规授权店,同品质谁更划算 - 贴膜攒钱买霍希
  • 2026年邯郸除甲醛公司,专业之选究竟花落哪家?且看这篇推荐! - 得意的笑125
  • H2E_Studio 版本发布说明(2026.5.17.0)
  • 面向对象程序设计与构造-第一次阶段性PTA大作业分析与总结
  • 温州上门黄金回收 六大正规品牌 全域四区两市五县高价无套路变现指南 - 金掌柜黄金回收
  • 物理AI:孙宇晨公开观点全梳理与国内产业链对标
  • 徐州黄金回收哪家靠谱 全域上门高价回收 旧金 K 金铂金一站式变现 - 金掌柜黄金回收
  • 杭州黄金回收哪家靠谱 全域上门高价回收 旧金 K 金铂金一站式变现 - 金掌柜黄金回收
  • 分层解耦—IOC与DI入门
  • 温州黄金回收哪家靠谱 全域上门高价回收 旧金 K 金铂金一站式变现 - 金掌柜黄金回收
  • 2026年4月知名的小型冻干机厂家推荐,小型冻干机/压盖款冻干机/工业冻干机,小型冻干机怎么选择推荐 - 品牌推荐师
  • 徐州黄金回收 全区域上门高价回收 正规无套路旧金变现全攻略 - 金掌柜黄金回收
  • 威海高效除鼠服务选型指南:威海绿伞环保科技有限公司,适配制造/医疗/餐饮多场景鼠害治理 - 得意的笑125
  • 徐州上门黄金回收 六大正规品牌 全域多区域高价无套路变现指南 - 金掌柜黄金回收
  • 杭州黄金回收 全区域上门高价回收 正规无套路旧金变现全攻略 - 金掌柜黄金回收
  • 宁波上门黄金回收 六大正规品牌 全域 6 区 2 县 2 市高价无套路变现 - 金掌柜黄金回收
  • 金价跌回千元关口,重庆卖金选哪条路最实在? - 福正美黄金回收
  • 杭州上门黄金回收 六大正规品牌 全域 10 区 2 县 1 市高价无套路变现 - 金掌柜黄金回收
  • 基于.NET的Windows窗体编程之WinForms对话框
  • 金价从 1500 跌到 996,重庆人戴旧的镯子要不要趁现在出手? - 福正美黄金回收
  • 连云港上门黄金回收 六大正规品牌 全域 3 区 3 县高价无套路变现指南 - 金掌柜黄金回收
  • 2026重庆装修公司推荐,省钱省心没套路 - 大渝测评
  • 浩卡联盟流量卡分销全攻略|浩卡官方推荐码 111666 注册教程 + 风控出单技巧,拿置顶最高权限 - 172号卡
  • 宿迁黄金回收哪家靠谱 全域上门高价回收 旧金 K 金铂金一站式变现 - 金掌柜黄金回收
  • 连云港黄金回收哪家靠谱 全域上门高价回收 旧金 K 金铂金一站式变现 - 金掌柜黄金回收
  • superpowers 目前 skills/ 目录下 14 个 skills 的逐个解读