spring-security 无法为基于Spring云API网关的项目设置代理服务器设置

zbq4xfa0  于 2022-11-11  发布在  Spring
关注(0)|答案(1)|浏览(164)

我正在使用Spring Cloud API Gateway,该应用程序具有基于yaml的配置,它工作得很好,因为所有路由都是内部链接,这意味着不需要任何代理。
但是,对用于验证JWT令牌的Spring Security存在依赖性,并且颁发者的URL是只能通过代理访问的资源。

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          jwk-set-uri: https://some-site.com/itmp/v1/.well-known/jwks.json
          issuer-uri: https://some-site.com/itmp/v1/

问题是:我不能使用http.proxyHost参数强制WebClient。我尝试了许多我发现all around the Internet的技术,比如在应用程序属性文件中隐式设置它们,或者在应用程序本身中硬编码。但对我来说没有任何效果。也许我错过了什么,也许Spring Cloud对这种行为有一些特殊的调整?
仅供参考项目基于Sping Boot 2.6.6(通常支持proxyWithSystemProperties的React器网络1.0.17)

jljoyd4f

jljoyd4f1#

最近我自己也遇到了这个问题。在反复了很多次之后,我最终创建了自己的ReactiveJwtDecoder bean,并设置了它内部使用的HttpClient/WebClient(使用NimbusReactiveJwtDecoder.webClient(WebClient))。大致如下:

@Bean
ReactiveJwtDecoder jwtDecoder(@Value("${ISSUER_URI}") String issuerUri,
                              @Value("${JWKS_URI}") String jwksUri) {

    HttpClient httpClient = HttpClient.create().proxyWithSystemProperties();
    WebClient webClient = WebClient.builder()
            .clientConnector(new ReactorClientHttpConnector(httpClient))
            .build();

    var jwtDecoder = NimbusReactiveJwtDecoder
            .withJwkSetUri(jwksUri)
            .webClient(webClient)
            .build();

    // import org.springframework.security.oauth2.jwt.JwtValidators;
    jwtDecoder.setJwtValidator(JwtValidators.createDefaultWithIssuer(issuerUri));

    return jwtDecoder;
}

您可能可以注入OAuth2ResourceServerProperties-bean而不是那两个@Value-注解的String来获取URL。
此外,请注意,如果应用程序已经执行了更多自定义的JWT声明验证,而不仅仅是检查issexpnbf,则必须记住注入现有的JwtValidator,并使用它来代替JwtValidators.createDefaultWithIssuer(String)

相关问题