Spring Security (oauth):当resttemplate未公开时,如何添加请求头?

3xiyfsfu  于 2021-09-30  发布在  Java
关注(0)|答案(1)|浏览(287)

我正在尝试使用SpringSecurity中内置的oauth支持来设置资源服务器。我需要在从资源服务器发送到auth服务的每个请求中注入一个新的请求头。我该怎么做?
用例
身份验证服务位于公司api网关转发服务的后面,如下所示:

Resource API > API Gateway > Auth API

通过api网关发送的每个请求都需要一个额外的头来向网关服务验证客户端。如何注入此标题?auth api实现是标准的oidc设置。
我的设置
我已将spring security oauth2添加到我的gradle构建中:

implementation 'org.springframework.security:spring-security-config'
    implementation 'org.springframework.security:spring-security-oauth2-resource-server'
    implementation 'org.springframework.security:spring-security-oauth2-jose'

我已在spring security中配置了颁发者uri,如下所示:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://auth/api/url

问题
在应用程序启动时,我遇到以下异常:

java.lang.IllegalArgumentException: Unable to resolve the Configuration with the provided Issuer of "https://auth/api/url"
    at org.springframework.security.oauth2.jwt.JwtDecoderProviderConfigurationUtils.getConfiguration(JwtDecoderProviderConfigurationUtils.java:99) ~[spring-security-oauth2-jose-5.4.2.jar:5.4.2]

调试的代码 JwtDecoderProviderConfigurationUtils ,我看到它失败了,因为配置请求中缺少api网关头。
问题是,我不知道如何修改配置UTIL以注入api网关头。请求是内联生成的,仅使用uri:

RequestEntity<Void> request = RequestEntity.get(uri).build();
                ResponseEntity<Map<String, Object>> response = rest.exchange(request, STRING_OBJECT_MAP);
                Map<String, Object> configuration = response.getBody();

resttemplate对我的应用程序代码是隐藏的,因此我看不到添加客户端拦截器的方法:

private static final RestTemplate rest = new RestTemplate();

事实上,整个config utils类都是包级访问,所以我真的不能对它做任何事情:

final class JwtDecoderProviderConfigurationUtils {

关于oidc解决方案的所有其他内容都应该是标准的。如何在不重新设计整个SpringSecurityOAuth解决方案及其所有自动配置的情况下注入所需的头文件?

nxagd54h

nxagd54h1#

通过设置以下任何属性启用的所有配置:

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri:
          jwk-set-uri:
          jws-algorithm:
          public-key-location:

最终导致了一场灾难 JwtDecoder 由spring boot创建和自动配置的bean(请参阅 OAuth2ResourceServerJwtConfiguration.JwtDecoderConfigurationorg.springframework.boot:spring-boot-autoconfigure jar)。
控制此过程并避免错误的最简单方法是提供您自己的bean:

@Bean
JwtDecoder jwtDecoder() {
    // ...
}

您可以在中使用该代码 JwtDecoderProviderConfigurationUtils 作为起点,将您自己的标题添加到您自己的标题中 RestTemplate ,或者您可以直接提供一个实现,并跳过对auth服务器的调用。

相关问题