当前位置: 首页 > 知识库问答 >
问题:

Spring云网关+Spring Security资源服务器

田仲卿
2023-03-14
  • Java 14
  • Spring Cloud Gateway版本:hoxton.sr3
  • spring boot版本:2.2.5.发布

现在我想将安全性集成到我的网关和所有下游微服务中。最终,我决定使用Firebase作为身份提供商(IDP)。我的Angular应用程序将从Firebase获得JWT令牌,并在每个请求中发送到云网关。因此,网关将开始只充当资源服务器,仅此而已。

下面是我如何尝试的。设置和Spring Cloud Gateway同时充当资源服务器。在这里很好地解释了Spring安全文档。

下面是我的配置

@EnableWebFluxSecurity
public class ResourceServerSecurityConfiguration {

  @Bean
  public SecurityWebFilterChain securityWebFilterChain(ServerHttpSecurity http) {
    // @formatter:off
    http
        .authorizeExchange()
        .anyExchange().authenticated()
        .and()
        .oauth2ResourceServer()
        .jwt();
    return http.build();
    // @formatter:on
  }
}

和application.yml

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: https://www.googleapis.com/service_accounts/v1/jwk/securetoken@system.gserviceaccount.com
          issuer-uri: https://securetoken.google.com/{$app.name}

正如您在这个YAML中看到的,我提供了jwk-set-uri和发行器来验证传入的令牌。

  @Bean
  @LoadBalanced
  public WebClient.Builder loadBalancedWebClientBuilder() {
    return WebClient.builder()
        .filter(new ServletBearerExchangeFilterFunction());
  }

正如您所看到的,它使用ServletBearerExchangeFilterFunction,这是我真正的问题所在。

我已经检查了Spring在配置oauth2ResourceServer时使用NoopServerSecurityContextRepository。据我目前所知,这是一个用来注册每个请求上下文的存储库。此外,我理解使用NoOp是有意义的,因为我们希望成为无状态的。然而,我不明白的是,如何使ServletBearerExchangeFilterFunction正常工作并向下游传递我的令牌。

我现在花了很多时间试图找出正确的方法来做这件事。

即使根据这一点,我试图做的事情也应该是合法和可能的。不知道我哪里弄错了。

共有1个答案

萧明贤
2023-03-14

Spring Cloud Gateway旨在提供一种简单而有效的方法来路由到API,并为它们提供交叉关注点,如:安全性、监视/度量和弹性。

如果您将SCG(Spring Cloud Gateway)设置为oauth2资源服务器,您必须做更多的自定义操作,也许像这样。我认为你不应该那样做。

您可以使用网关作为路由,将访问令牌头发送给SCG,SCG将访问令牌带给oauth2资源服务器,并在oauth2资源服务器端检查权限。

Spring云网关令牌中继网关过滤器工厂说:

{githubmaster}/src/main/java/org/springframework/cloud/gateway/security/tokenrelaygatewayfilterfactory.java[filter]从当前通过身份验证的用户中提取访问令牌,并将其放在下游请求的请求头中。

这样可以在你的应用程序中保持oauth2的清晰度。

 类似资料:
  • 我一直在试图找到一个与eureka服务器集成的spring cloud gateway的运行示例,以及一些Hystrix示例,但到目前为止我还没有找到。有什么地方可以找到它吗?我真的很想看到spring cloud gateway投入使用,取代我目前的Zuul API服务。 谢谢!

  • 我使用Spring创建微服务。我使用Eureka进行服务发现,使用Zuul进行路由。现在我想切换到Spring Cloud Gateway(因为它的非阻塞特性),但是我没有找到自动路由到每个Eureka服务的方法。 例如,如果一个服务'eureka-client'注册到了Eureka,那么Zuul本身就为这个服务提供了类似于localhost:8762/eureka-client的路径。使用Spr

  • 问题内容: 我们已经设置了OAuth2授权服务器,因此我需要创建一个相应的资源服务器(单独的服务器)。我们计划使用Spring Security OAuth2项目。他们关于设置资源服务器的文档: https://github.com/spring-projects/spring-security- oauth/wiki/oAuth2#resource-server-configuration 应该

  • 我们已经设置了一个OAuth2授权服务器,所以我需要创建一个相应的资源服务器(单独的服务器)。我们计划使用Spring Security OAuth2项目。他们关于设置资源服务器的文档: https://github.com/spring-projects/spring-security-oauth/wiki/oauth2#资源-服务器-配置 应该指向令牌处理bean。然而,令牌处理似乎是由服务器

  • 试图让UserDetailsService为我设置的oauth2资源服务器工作。我能够成功地对jwt进行身份验证,但是我所做的一切似乎都无法让它调用loadUserByUsername方法。它最初使用的是SAML,并且可以工作,但现在我切换到了Oauth2,我无法让它工作。 我在google上发现,我只需要用@service将类注册为bean,spring就会把它捡起来,但它不起作用。我还尝试通过

  • 我有一个带有一些endpoint的anexo API,比如: 如何将Spring Cloud Gateway与这些endpoint一起使用?