Skip to content

Commit bf9b95a

Browse files
franticticktickrwinch
authored andcommitted
Add Support OAuth2AuthorizationRequestResolver As Bean
Closes gh-16380 Signed-off-by: Max Batischev <[email protected]>
1 parent 72a2831 commit bf9b95a

File tree

2 files changed

+72
-16
lines changed

2 files changed

+72
-16
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2LoginConfigurer.java

+22-15
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -68,6 +68,7 @@
6868
import org.springframework.security.oauth2.client.userinfo.OAuth2UserService;
6969
import org.springframework.security.oauth2.client.web.AuthenticatedPrincipalOAuth2AuthorizedClientRepository;
7070
import org.springframework.security.oauth2.client.web.AuthorizationRequestRepository;
71+
import org.springframework.security.oauth2.client.web.DefaultOAuth2AuthorizationRequestResolver;
7172
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestRedirectFilter;
7273
import org.springframework.security.oauth2.client.web.OAuth2AuthorizationRequestResolver;
7374
import org.springframework.security.oauth2.client.web.OAuth2AuthorizedClientRepository;
@@ -396,20 +397,8 @@ public void init(B http) throws Exception {
396397

397398
@Override
398399
public void configure(B http) throws Exception {
399-
OAuth2AuthorizationRequestRedirectFilter authorizationRequestFilter;
400-
if (this.authorizationEndpointConfig.authorizationRequestResolver != null) {
401-
authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
402-
this.authorizationEndpointConfig.authorizationRequestResolver);
403-
}
404-
else {
405-
String authorizationRequestBaseUri = this.authorizationEndpointConfig.authorizationRequestBaseUri;
406-
if (authorizationRequestBaseUri == null) {
407-
authorizationRequestBaseUri = OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI;
408-
}
409-
authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
410-
OAuth2ClientConfigurerUtils.getClientRegistrationRepository(this.getBuilder()),
411-
authorizationRequestBaseUri);
412-
}
400+
OAuth2AuthorizationRequestRedirectFilter authorizationRequestFilter = new OAuth2AuthorizationRequestRedirectFilter(
401+
getAuthorizationRequestResolver());
413402
if (this.authorizationEndpointConfig.authorizationRequestRepository != null) {
414403
authorizationRequestFilter
415404
.setAuthorizationRequestRepository(this.authorizationEndpointConfig.authorizationRequestRepository);
@@ -440,6 +429,24 @@ protected RequestMatcher createLoginProcessingUrlMatcher(String loginProcessingU
440429
return new AntPathRequestMatcher(loginProcessingUrl);
441430
}
442431

432+
private OAuth2AuthorizationRequestResolver getAuthorizationRequestResolver() {
433+
if (this.authorizationEndpointConfig.authorizationRequestResolver != null) {
434+
return this.authorizationEndpointConfig.authorizationRequestResolver;
435+
}
436+
ClientRegistrationRepository clientRegistrationRepository = OAuth2ClientConfigurerUtils
437+
.getClientRegistrationRepository(getBuilder());
438+
ResolvableType resolvableType = ResolvableType.forClass(OAuth2AuthorizationRequestResolver.class);
439+
OAuth2AuthorizationRequestResolver bean = getBeanOrNull(resolvableType);
440+
if (bean != null) {
441+
return bean;
442+
}
443+
String authorizationRequestBaseUri = this.authorizationEndpointConfig.authorizationRequestBaseUri;
444+
if (authorizationRequestBaseUri == null) {
445+
authorizationRequestBaseUri = OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI;
446+
}
447+
return new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository, authorizationRequestBaseUri);
448+
}
449+
443450
@SuppressWarnings("unchecked")
444451
private JwtDecoderFactory<ClientRegistration> getJwtDecoderFactoryBean() {
445452
ResolvableType type = ResolvableType.forClassWithGenerics(JwtDecoderFactory.class, ClientRegistration.class);

config/src/test/java/org/springframework/security/config/annotation/web/configurers/oauth2/client/OAuth2LoginConfigurerTests.java

+50-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2002-2024 the original author or authors.
2+
* Copyright 2002-2025 the original author or authors.
33
*
44
* Licensed under the Apache License, Version 2.0 (the "License");
55
* you may not use this file except in compliance with the License.
@@ -379,6 +379,19 @@ public void oauth2LoginWithCustomAuthorizationRequestParameters() throws Excepti
379379
"https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=clientId&scope=openid+profile+email&state=state&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fgoogle&custom-param1=custom-value1");
380380
}
381381

382+
@Test
383+
public void oauth2LoginWithCustomAuthorizationRequestParametersAndResolverAsBean() throws Exception {
384+
loadConfig(OAuth2LoginConfigCustomAuthorizationRequestResolverBean.class);
385+
// @formatter:off
386+
// @formatter:on
387+
String requestUri = "/oauth2/authorization/google";
388+
this.request = new MockHttpServletRequest("GET", requestUri);
389+
this.request.setServletPath(requestUri);
390+
this.springSecurityFilterChain.doFilter(this.request, this.response, this.filterChain);
391+
assertThat(this.response.getRedirectedUrl()).isEqualTo(
392+
"https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=clientId&scope=openid+profile+email&state=state&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fgoogle&custom-param1=custom-value1");
393+
}
394+
382395
@Test
383396
public void requestWhenOauth2LoginWithCustomAuthorizationRequestParametersThenParametersInRedirectedUrl()
384397
throws Exception {
@@ -940,6 +953,42 @@ SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
940953

941954
}
942955

956+
@Configuration
957+
@EnableWebSecurity
958+
static class OAuth2LoginConfigCustomAuthorizationRequestResolverBean extends CommonSecurityFilterChainConfig {
959+
960+
private ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
961+
GOOGLE_CLIENT_REGISTRATION);
962+
963+
@Bean
964+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
965+
// @formatter:off
966+
http
967+
.oauth2Login()
968+
.clientRegistrationRepository(this.clientRegistrationRepository)
969+
.authorizationEndpoint();
970+
// @formatter:on
971+
return super.configureFilterChain(http);
972+
}
973+
974+
@Bean
975+
OAuth2AuthorizationRequestResolver resolver() {
976+
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
977+
// @formatter:off
978+
OAuth2AuthorizationRequest result = OAuth2AuthorizationRequest.authorizationCode()
979+
.authorizationUri("https://accounts.google.com/authorize")
980+
.clientId("client-id")
981+
.state("adsfa")
982+
.authorizationRequestUri(
983+
"https://accounts.google.com/o/oauth2/v2/auth?response_type=code&client_id=clientId&scope=openid+profile+email&state=state&redirect_uri=http%3A%2F%2Flocalhost%2Flogin%2Foauth2%2Fcode%2Fgoogle&custom-param1=custom-value1")
984+
.build();
985+
given(resolver.resolve(any())).willReturn(result);
986+
// @formatter:on
987+
return resolver;
988+
}
989+
990+
}
991+
943992
@Configuration
944993
@EnableWebSecurity
945994
static class OAuth2LoginConfigCustomAuthorizationRequestResolverInLambda

0 commit comments

Comments
 (0)