spring - Spring使用自定义请求配置WebClient Oauth2身份验证
问题描述
在对用作所有实例的基础的ServerOAuth2AuthorizedClientExchangeFilterFunction
a 应用过滤器时,我无法理解如何自定义使用 Oauth2 发出的身份验证请求。WebClient.Builder
WebClient
系统本身在工作,请求是根据Oauth2规范生成的。但是,我的身份验证服务有一些额外的字段需要存在才能使身份验证工作。这就是问题所在,到目前为止,我找不到任何合理的方法来添加我需要的字段或自定义请求本身。
到目前为止,我唯一能找到的就是实现一个ReactiveOAuth2AuthorizedClientManager
. 但是我对此非常抗拒,因为没有可以扩展的该接口的通用实现,并且所有可用的实现都final
可以扩展并且不能扩展。由于我的用例只是向请求正文添加一个字段,我希望有更好的方法来实现这一点。
任何帮助将不胜感激。谢谢你的时间。
我想要达到的目标
- 向认证 Oauth2 请求添加一个字段,由 Spring Security 管理
有什么阻碍
- 找不到自定义向身份验证请求添加自定义字段的方法。幕后发生了太多的巫术魔法。
配置
@Configuration
public class WebClientConfig {
@Bean("azure")
public ReactiveClientRegistrationRepository getRegistration(
@Value("${spring.security.oauth2.client.provider.azure.token-uri}")
String tokenUri,
@Value("${spring.security.oauth2.client.registration.azure.client-id}")
String clientId,
@Value("${spring.security.oauth2.client.registration.azure.client-secret}")
String clientSecret,
@Value("${spring.security.oauth2.client.registration.azure.authorization-grant-type}")
String authorizationGrantType
)
{
ClientRegistration registration = getClientRegistration(
"azure",
tokenUri,
clientId,
clientSecret,
getAuthorizationGrantType(authorizationGrantType)
);
return new InMemoryReactiveClientRegistrationRepository(registration);
}
protected AuthorizationGrantType getAuthorizationGrantType(@Value("${spring.security.oauth2.client.registration.azure.authorization-grant-type}") String authorizationGrantType) {
return new AuthorizationGrantType(authorizationGrantType);
}
protected ClientRegistration getClientRegistration(
String registrationId,
String tokenUri,
String clientId,
String clientSecret,
AuthorizationGrantType authorizationGrantType
) {
return ClientRegistration
.withRegistrationId(registrationId)
.tokenUri(tokenUri)
.clientId(clientId)
.clientSecret(clientSecret)
.authorizationGrantType(authorizationGrantType)
.build();
}
@Bean
public ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2AuthenticationFilter(
@Qualifier("azure") ReactiveClientRegistrationRepository clientRegistrations
) {
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth = new ServerOAuth2AuthorizedClientExchangeFilterFunction(
clientRegistrations,
new UnAuthenticatedServerOAuth2AuthorizedClientRepository());
oauth.setDefaultClientRegistrationId("azure");
oauth.setDefaultOAuth2AuthorizedClient(true);
return oauth;
}
@Bean("base")
public WebClient.Builder webClientBaseBuilder()
{
return WebClient.builder();
}
@Bean
@Primary
public WebClient.Builder webClientBuilderWithFilters(
@Qualifier("base") WebClient.Builder baseBuilder,
ServerOAuth2AuthorizedClientExchangeFilterFunction oauth2AuthenticationFilter
) {
return baseBuilder
.filter(oauth2AuthenticationFilter);
}
@Bean
public WebClient webClient(
@Value("${api.appId}") String appId,
@Value("${api.url}") String url,
WebClient.Builder builder
) {
return builder
.baseUrl(url)
.defaultHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE)
.defaultHeader("Application-Id", appId)
.build();
}
}
解决方案
请参阅 spring 安全文档,假设您正在使用客户端凭据授予
如果需要自定义Token Request的预处理,可以给DefaultClientCredentialsTokenResponseClient.setRequestEntityConverter()提供一个自定义的Converter<OAuth2ClientCredentialsGrantRequest, RequestEntity<?>>
推荐阅读
- c - 如何从字符串中获取最后一个字符
- azure - UserLastLogon - 导出
- go - 单一方法上的多个接收器
- python - 保存后“OSError:无法将文件解释为泡菜”
- java - 寻找回文数
- hadoop - 高可用性在 Hadoop 集群中不起作用
- powershell-7.0 - New-AzureADApplication RequiredResourceAccess
- javascript - 单击按钮发送 HTTP 请求时防止 HTML 页面重新加载 [更新]
- java - Android Studio 记住播放器进度
- node.js - 使用 MongoDB 和 Graphql 管理聊天室中的消息