Skip to content

Commit e8a0716

Browse files
Add Support OAuth2AuthorizationRequestResolver As Bean
Closes gh-16380
1 parent 9805648 commit e8a0716

File tree

2 files changed

+70
-17
lines changed

2 files changed

+70
-17
lines changed

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

+20-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);
@@ -435,6 +424,22 @@ public void configure(B http) throws Exception {
435424
super.configure(http);
436425
}
437426

427+
private OAuth2AuthorizationRequestResolver getAuthorizationRequestResolver() {
428+
if (this.authorizationEndpointConfig.authorizationRequestResolver != null) {
429+
return this.authorizationEndpointConfig.authorizationRequestResolver;
430+
}
431+
ClientRegistrationRepository clientRegistrationRepository = OAuth2ClientConfigurerUtils
432+
.getClientRegistrationRepository(getBuilder());
433+
ResolvableType resolvableType = ResolvableType.forClass(OAuth2AuthorizationRequestResolver.class);
434+
OAuth2AuthorizationRequestResolver bean = getBeanOrNull(resolvableType);
435+
String authorizationRequestBaseUri = this.authorizationEndpointConfig.authorizationRequestBaseUri;
436+
if (authorizationRequestBaseUri == null) {
437+
authorizationRequestBaseUri = OAuth2AuthorizationRequestRedirectFilter.DEFAULT_AUTHORIZATION_REQUEST_BASE_URI;
438+
}
439+
return (bean != null) ? bean : new DefaultOAuth2AuthorizationRequestResolver(clientRegistrationRepository,
440+
authorizationRequestBaseUri);
441+
}
442+
438443
@Override
439444
protected RequestMatcher createLoginProcessingUrlMatcher(String loginProcessingUrl) {
440445
return new AntPathRequestMatcher(loginProcessingUrl);

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

+50-2
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.
@@ -355,7 +355,19 @@ public void oauth2LoginConfigLoginProcessingUrl() throws Exception {
355355
.hasToString("OAUTH2_USER");
356356
}
357357

358-
// gh-5521
358+
@Test
359+
public void oauth2LoginWithCustomAuthorizationRequestParametersAndResolverAsBean() throws Exception {
360+
loadConfig(OAuth2LoginConfigCustomAuthorizationRequestResolverBean.class);
361+
// @formatter:off
362+
// @formatter:on
363+
String requestUri = "/oauth2/authorization/google";
364+
this.request = new MockHttpServletRequest("GET", requestUri);
365+
this.request.setServletPath(requestUri);
366+
this.springSecurityFilterChain.doFilter(this.request, this.response, this.filterChain);
367+
assertThat(this.response.getRedirectedUrl()).isEqualTo(
368+
"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");
369+
}
370+
359371
@Test
360372
public void oauth2LoginWithCustomAuthorizationRequestParameters() throws Exception {
361373
loadConfig(OAuth2LoginConfigCustomAuthorizationRequestResolver.class);
@@ -940,6 +952,42 @@ SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
940952

941953
}
942954

955+
@Configuration
956+
@EnableWebSecurity
957+
static class OAuth2LoginConfigCustomAuthorizationRequestResolverBean extends CommonSecurityFilterChainConfig {
958+
959+
private ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
960+
GOOGLE_CLIENT_REGISTRATION);
961+
962+
@Bean
963+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
964+
// @formatter:off
965+
http
966+
.oauth2Login()
967+
.clientRegistrationRepository(this.clientRegistrationRepository)
968+
.authorizationEndpoint();
969+
// @formatter:on
970+
return super.configureFilterChain(http);
971+
}
972+
973+
@Bean
974+
OAuth2AuthorizationRequestResolver resolver() {
975+
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
976+
// @formatter:off
977+
OAuth2AuthorizationRequest result = OAuth2AuthorizationRequest.authorizationCode()
978+
.authorizationUri("https://accounts.google.com/authorize")
979+
.clientId("client-id")
980+
.state("adsfa")
981+
.authorizationRequestUri(
982+
"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")
983+
.build();
984+
given(resolver.resolve(any())).willReturn(result);
985+
// @formatter:on
986+
return resolver;
987+
}
988+
989+
}
990+
943991
@Configuration
944992
@EnableWebSecurity
945993
static class OAuth2LoginConfigCustomAuthorizationRequestResolverInLambda

0 commit comments

Comments
 (0)