Spring Cloud Gateway+Keycloak架构下微服务无认证访问问题咨询
问题解答
核心问题解决:让catalog-service强制认证
你说得对,直接访问catalog-service无需认证是因为它没配置安全校验,正确的处理方式是将catalog-service也声明为资源服务器,并在Spring Gateway中启用Token Relay,这个方案完全可行,且是微服务架构下的安全最佳实践。
具体实现步骤
配置catalog-service为资源服务器
- 添加Spring Security OAuth2资源服务器依赖(比如
spring-boot-starter-oauth2-resource-server) - 在
application.yml里配置Keycloak的认证信息:spring: security: oauth2: resourceserver: jwt: issuer-uri: http://your-keycloak-server/auth/realms/your-realm jwk-set-uri: http://your-keycloak-server/auth/realms/your-realm/protocol/openid-connect/certs - 编写Spring Security配置类,强制所有接口需要认证:
@Configuration @EnableWebSecurity public class CatalogSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() ) .oauth2ResourceServer(oauth2 -> oauth2 .jwt(Customizer.withDefaults()) ); return http.build(); } }
- 添加Spring Security OAuth2资源服务器依赖(比如
在Spring Gateway中启用Token Relay
- 确保网关已添加
spring-cloud-starter-gateway和spring-boot-starter-oauth2-resource-server依赖 - 在网关的路由配置里,给指向catalog-service的路由添加
TokenRelay过滤器:spring: cloud: gateway: routes: - id: catalog-service uri: lb://catalog-service predicates: - Path=/catalog/** filters: - TokenRelay= - 保证网关本身的资源服务器配置正确,能正常验证前端传来的JWT令牌。
- 确保网关已添加
网关角色的选择:资源服务器VS客户端
网上多数示例把网关作为客户端,是另一种常见架构,但你当前将网关作为资源服务器的方案完全合理,不需要强制调整,两种模式适用场景不同:
- 网关作为资源服务器+令牌中继:
适合前端直接从Keycloak获取JWT令牌,调用网关时携带令牌,网关先验证令牌有效性,再将令牌中继给下游服务,下游服务自己再验证令牌。这种模式下每个服务都独立做安全校验,即使网关被绕过,下游服务也能阻止未认证请求,安全性更高,是微服务安全的最佳实践。 - 网关作为OAuth2客户端:
适合前端不直接和认证服务器交互,由网关作为中间层,先向Keycloak申请令牌,再用该令牌调用下游服务。这种模式下下游服务可能只信任网关的请求,但依赖网关的安全校验,一旦网关出问题,下游服务就暴露了,安全性不如前者。
总结
- 必须给catalog-service配置资源服务器,避免直接访问的安全漏洞;
- 网关启用Token Relay是下游服务获取令牌进行校验的必要步骤;
- 保持网关作为资源服务器的架构更符合微服务安全的最佳实践,无需调整为客户端模式。
内容的提问来源于stack exchange,提问作者ok buddy
相关产品推荐
相关产品推荐

