Spring Gateway对接Spring Authorization Server授权实现方案咨询
可以实现,完全不需要对外暴露Spring Authorization Server,核心方案是将Spring Gateway作为OAuth2资源服务器,仅在网关内网侧和授权服务器交互完成令牌校验,外网仅暴露网关入口即可。
1 补充依赖
首先在Gradle配置中新增OAuth2资源服务器依赖,让网关具备令牌校验能力:
implementation 'org.springframework.boot:spring-boot-starter-oauth2-resource-server'
2 修正路由配置
你当前的路由配置存在两处问题:一是路径匹配规则和需要拦截的前端请求不匹配,二是负载均衡URI配置不符合规范。修正后配置如下:
@Bean public RouteLocator routes(RouteLocatorBuilder builder, LoggingGatewayFilterFactory loggingFactory) { return builder.routes() .route("service_route_clients_summary", r -> r.path("/api/management/home/clients/summary") .filters(f -> f.rewritePath("/api(?<segment>.*)", "${segment}") .filter(loggingFactory.apply(new LoggingGatewayFilterFactory.Config("My Custom Message", true, true)))) // lb协议后仅填写Eureka中注册的服务名,路径会经过重写后自动拼接 .uri("lb://merchant-hub-admin-service")) .build(); }
3 配置OAuth2校验规则
在网关的application.yml中添加授权服务器的内网访问地址,该地址不需要对外网开放,仅需要网关所在网络可以连通即可:
spring: security: oauth2: resourceserver: jwt: # 替换为你的Spring Authorization Server内网JWT公钥地址 issuer-uri: http://{SAS内网IP}:{SAS端口}/oauth2/jwks
提示:如果下游服务不需要二次校验令牌,可添加配置移除传递给下游的Authorization请求头,避免敏感信息泄露。
4 新增网关安全配置
添加安全配置类,要求所有请求必须携带有效JWT令牌才能放行:
@Configuration @EnableWebFluxSecurity public class GatewaySecurityConfig { @Bean public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) { http .authorizeExchange(exchange -> exchange .anyExchange().authenticated() ) .oauth2ResourceServer(ServerHttpSecurity.OAuth2ResourceServerSpec::jwt) .csrf(ServerHttpSecurity.CsrfSpec::disable); return http.build(); } }
实现流程说明
- 客户端通过登录接口获取Spring Authorization Server签发的JWT令牌,登录接口可通过网关路由到内部的认证服务,无需对外暴露授权服务器
- 客户端携带JWT请求
/api/management/home/clients/summary接口,请求统一发往网关 - 网关内网调用授权服务器的公钥接口校验令牌有效性,校验失败直接返回401,校验通过执行路径重写规则
- 网关将重写后的内部路径
/management/home/clients/summary转发到下游服务,完成请求处理
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

