Spring Boot API Gateway集成JWT认证后路由失效返回404问题求助
Spring Cloud Gateway集成JWT认证后路由404问题排查方案
1. Spring Security路径放行规则校验
- 首先确认
SecurityWebFilterChain配置中未错误拦截需要转发的路由路径,若存在网关全局前缀或者下游服务路径,需要显式配置白名单或者正确的认证规则,参考配置示例:
@Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { return http .csrf(ServerHttpSecurity.CsrfSpec::disable) .authorizeExchange(exchange -> exchange // 登录等公开接口放行 .pathMatchers("/auth/**", "/public/**").permitAll() // 其余业务路径需认证 .anyExchange().authenticated() ) .oauth2ResourceServer(oauth2 -> oauth2.jwt(Customizer.withDefaults())) .build(); }
注意:不要在Spring Security配置和自定义JWT全局过滤器中重复做路径拦截逻辑,避免路径匹配冲突导致路由失效
2. 网关路由配置优先级校验
- Spring Cloud Gateway的路由按照配置顺序从上到下匹配,需确认精准路由放在通配符路由之前,否则精准路由不会被触发,参考正确YAML配置:
spring: cloud: gateway: routes: # 精准业务路由放前 - id: order-service-route uri: lb://order-service predicates: - Path=/api/order/** filters: - StripPrefix=1 # 通配路由放最后 - id: common-route uri: lb://common-service predicates: - Path=/**
若自定义了JWT全局过滤器,需确保过滤器的order值大于RouteToRequestUrlFilter的默认值10000,否则会在路由匹配前执行认证逻辑,干扰路由规则生效
3. JWT过滤器逻辑校验
- 检查自定义JWT过滤器的逻辑,是否存在错误修改请求URI的操作,比如错误添加路径前缀、篡改请求路径参数,都会导致路由匹配失败返回404。正确的JWT过滤器仅做token合法性校验、用户信息解析注入,不会修改原始请求的URI:
@Override public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request = exchange.getRequest(); String authHeader = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); // 仅做token校验、用户信息解析,不要修改request的URI属性 if (StringUtils.hasText(authHeader) && authHeader.startsWith("Bearer ")) { String token = authHeader.substring(7); // 校验token合法性、解析权限后可将用户信息放入请求头传递到下游 } return chain.filter(exchange); }
4. 下游服务注册校验
- 若使用Nacos、Eureka等注册中心做动态路由,需确认下游服务的注册名称和路由配置中
lb://后的服务名完全一致(大小写敏感),且下游服务状态正常,网关拉取到的服务列表包含对应服务实例,否则会找不到下游服务返回404。
内容的提问来源于stack exchange,提问作者Harish Kumar
相关产品推荐
相关产品推荐

