Skip to content

Commit 08cbdb4

Browse files
committed
Merge remote-tracking branch 'origin/6.5.x'
2 parents 396809b + 9f88ef8 commit 08cbdb4

File tree

2 files changed

+68
-4
lines changed

2 files changed

+68
-4
lines changed

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

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -350,11 +350,9 @@ public void init(B http) throws Exception {
350350
oidcAuthorizationCodeAuthenticationProvider.setAuthoritiesMapper(userAuthoritiesMapper);
351351
oidcAuthorizedClientRefreshedEventListener.setAuthoritiesMapper(userAuthoritiesMapper);
352352
}
353-
oidcAuthorizationCodeAuthenticationProvider = this.postProcess(oidcAuthorizationCodeAuthenticationProvider);
354-
http.authenticationProvider(oidcAuthorizationCodeAuthenticationProvider);
353+
http.authenticationProvider(this.postProcess(oidcAuthorizationCodeAuthenticationProvider));
355354

356-
oidcAuthorizedClientRefreshedEventListener = this.postProcess(oidcAuthorizedClientRefreshedEventListener);
357-
registerDelegateApplicationListener(oidcAuthorizedClientRefreshedEventListener);
355+
registerDelegateApplicationListener(this.postProcess(oidcAuthorizedClientRefreshedEventListener));
358356
configureOidcUserRefreshedEventListener(http);
359357
}
360358
else {

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import org.junit.jupiter.api.BeforeEach;
3030
import org.junit.jupiter.api.Test;
3131
import org.junit.jupiter.api.extension.ExtendWith;
32+
import org.mockito.Mockito;
3233

3334
import org.springframework.beans.factory.BeanCreationException;
3435
import org.springframework.beans.factory.NoUniqueBeanDefinitionException;
@@ -43,11 +44,14 @@
4344
import org.springframework.mock.web.MockFilterChain;
4445
import org.springframework.mock.web.MockHttpServletRequest;
4546
import org.springframework.mock.web.MockHttpServletResponse;
47+
import org.springframework.security.authentication.AuthenticationProvider;
4648
import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
4749
import org.springframework.security.config.Customizer;
50+
import org.springframework.security.config.ObjectPostProcessor;
4851
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
4952
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
5053
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
54+
import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurerTests.OAuth2LoginConfigCustomWithPostProcessor.SpyObjectPostProcessor;
5155
import org.springframework.security.config.oauth2.client.CommonOAuth2Provider;
5256
import org.springframework.security.config.test.SpringTestContext;
5357
import org.springframework.security.config.test.SpringTestContextExtension;
@@ -711,6 +715,22 @@ public void oidcLoginWhenOAuth2ClientBeansConfiguredThenNotShared() throws Excep
711715
verifyNoInteractions(clientRegistrationRepository, authorizedClientRepository);
712716
}
713717

718+
// gh-17175
719+
@Test
720+
public void oauth2LoginWhenAuthenticationProviderPostProcessorThenUses() throws Exception {
721+
loadConfig(OAuth2LoginConfigCustomWithPostProcessor.class);
722+
// setup authorization request
723+
OAuth2AuthorizationRequest authorizationRequest = createOAuth2AuthorizationRequest();
724+
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, this.request, this.response);
725+
// setup authentication parameters
726+
this.request.setParameter("code", "code123");
727+
this.request.setParameter("state", authorizationRequest.getState());
728+
// perform test
729+
this.springSecurityFilterChain.doFilter(this.request, this.response, this.filterChain);
730+
// assertions
731+
verify(this.context.getBean(SpyObjectPostProcessor.class).spy).authenticate(any());
732+
}
733+
714734
private void loadConfig(Class<?>... configs) {
715735
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
716736
applicationContext.register(configs);
@@ -1296,6 +1316,52 @@ OAuth2AuthorizedClientRepository authorizedClientRepository() {
12961316

12971317
}
12981318

1319+
@Configuration
1320+
@EnableWebSecurity
1321+
static class OAuth2LoginConfigCustomWithPostProcessor {
1322+
1323+
private final ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
1324+
GOOGLE_CLIENT_REGISTRATION);
1325+
1326+
private final ObjectPostProcessor<AuthenticationProvider> postProcessor = new SpyObjectPostProcessor();
1327+
1328+
@Bean
1329+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
1330+
// @formatter:off
1331+
http
1332+
.oauth2Login((oauth2Login) -> oauth2Login
1333+
.clientRegistrationRepository(this.clientRegistrationRepository)
1334+
.withObjectPostProcessor(this.postProcessor)
1335+
);
1336+
// @formatter:on
1337+
return http.build();
1338+
}
1339+
1340+
@Bean
1341+
ObjectPostProcessor<AuthenticationProvider> mockPostProcessor() {
1342+
return this.postProcessor;
1343+
}
1344+
1345+
@Bean
1346+
HttpSessionOAuth2AuthorizationRequestRepository oauth2AuthorizationRequestRepository() {
1347+
return new HttpSessionOAuth2AuthorizationRequestRepository();
1348+
}
1349+
1350+
static class SpyObjectPostProcessor implements ObjectPostProcessor<AuthenticationProvider> {
1351+
1352+
AuthenticationProvider spy;
1353+
1354+
@Override
1355+
public <O extends AuthenticationProvider> O postProcess(O object) {
1356+
O spy = Mockito.spy(object);
1357+
this.spy = spy;
1358+
return spy;
1359+
}
1360+
1361+
}
1362+
1363+
}
1364+
12991365
private abstract static class CommonSecurityFilterChainConfig {
13001366

13011367
SecurityFilterChain configureFilterChain(HttpSecurity http) throws Exception {

0 commit comments

Comments
 (0)