You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Cloud Gateway+Keycloak架构下微服务无认证访问问题咨询

问题解答

核心问题解决:让catalog-service强制认证

你说得对,直接访问catalog-service无需认证是因为它没配置安全校验,正确的处理方式是将catalog-service也声明为资源服务器,并在Spring Gateway中启用Token Relay,这个方案完全可行,且是微服务架构下的安全最佳实践。

具体实现步骤

  1. 配置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();
          }
      }
      
  2. 在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:17:19