【发布时间】:2020-08-21 21:49:49
【问题描述】:
在对用作所有 WebClient 实例的基础的 WebClient.Builder 应用 ServerOAuth2AuthorizedClientExchangeFilterFunction 过滤器时,我无法理解如何自定义使用 Oauth2 发出的身份验证请求。
系统本身在工作,根据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 spring-boot spring-security-oauth2 spring-webclient