我正在尝试使用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解决方案及其所有自动配置的情况下注入所需的头文件?
1条答案
按热度按时间nxagd54h1#
通过设置以下任何属性启用的所有配置:
最终导致了一场灾难
JwtDecoder
由spring boot创建和自动配置的bean(请参阅OAuth2ResourceServerJwtConfiguration.JwtDecoderConfiguration
在org.springframework.boot:spring-boot-autoconfigure
jar)。控制此过程并避免错误的最简单方法是提供您自己的bean:
您可以在中使用该代码
JwtDecoderProviderConfigurationUtils
作为起点,将您自己的标题添加到您自己的标题中RestTemplate
,或者您可以直接提供一个实现,并跳过对auth服务器的调用。