Skip to content

Commit 769b5a2

Browse files
committed
Polish Post-Processor Test
Issue gh-17175
1 parent 5dfa2ab commit 769b5a2

File tree

1 file changed

+40
-49
lines changed

1 file changed

+40
-49
lines changed

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

Lines changed: 40 additions & 49 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;
@@ -50,12 +51,12 @@
5051
import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
5152
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
5253
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
54+
import org.springframework.security.config.annotation.web.configurers.oauth2.client.OAuth2LoginConfigurerTests.OAuth2LoginConfigCustomWithPostProcessor.SpyObjectPostProcessor;
5355
import org.springframework.security.config.oauth2.client.CommonOAuth2Provider;
5456
import org.springframework.security.config.test.SpringTestContext;
5557
import org.springframework.security.config.test.SpringTestContextExtension;
5658
import org.springframework.security.context.DelegatingApplicationListener;
5759
import org.springframework.security.core.Authentication;
58-
import org.springframework.security.core.AuthenticationException;
5960
import org.springframework.security.core.GrantedAuthority;
6061
import org.springframework.security.core.authority.AuthorityUtils;
6162
import org.springframework.security.core.authority.SimpleGrantedAuthority;
@@ -219,28 +220,6 @@ public void oauth2Login() throws Exception {
219220
.hasToString("OAUTH2_USER");
220221
}
221222

222-
// gh-17175
223-
@Test
224-
public void postProcessorSucceedsWhenProcessorReturnsAuthenticationProvider() throws Exception {
225-
loadConfig(OAuth2LoginConfigCustomWithPostProcessor.class);
226-
// setup authorization request
227-
OAuth2AuthorizationRequest authorizationRequest = createOAuth2AuthorizationRequest();
228-
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, this.request, this.response);
229-
// setup authentication parameters
230-
this.request.setParameter("code", "code123");
231-
this.request.setParameter("state", authorizationRequest.getState());
232-
// perform test
233-
this.springSecurityFilterChain.doFilter(this.request, this.response, this.filterChain);
234-
// assertions
235-
Authentication authentication = this.securityContextRepository
236-
.loadContext(new HttpRequestResponseHolder(this.request, this.response))
237-
.getAuthentication();
238-
assertThat(authentication.getAuthorities()).hasSize(1);
239-
assertThat(authentication.getAuthorities()).first()
240-
.isInstanceOf(OAuth2UserAuthority.class)
241-
.hasToString("OAUTH2_USER");
242-
}
243-
244223
@Test
245224
public void requestWhenCustomSecurityContextHolderStrategyThenUses() throws Exception {
246225
loadConfig(OAuth2LoginConfig.class, SecurityContextChangedListenerConfig.class);
@@ -736,6 +715,22 @@ public void oidcLoginWhenOAuth2ClientBeansConfiguredThenNotShared() throws Excep
736715
verifyNoInteractions(clientRegistrationRepository, authorizedClientRepository);
737716
}
738717

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+
739734
private void loadConfig(Class<?>... configs) {
740735
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
741736
applicationContext.register(configs);
@@ -1323,50 +1318,46 @@ OAuth2AuthorizedClientRepository authorizedClientRepository() {
13231318

13241319
@Configuration
13251320
@EnableWebSecurity
1326-
static class OAuth2LoginConfigCustomWithPostProcessor
1327-
extends CommonLambdaSecurityFilterChainConfig {
1321+
static class OAuth2LoginConfigCustomWithPostProcessor {
13281322

1329-
private ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
1323+
private final ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
13301324
GOOGLE_CLIENT_REGISTRATION);
13311325

1332-
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
1326+
private final ObjectPostProcessor<AuthenticationProvider> postProcessor = new SpyObjectPostProcessor();
13331327

13341328
@Bean
13351329
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
13361330
// @formatter:off
13371331
http
1338-
.oauth2Login((oauth2Login) ->
1339-
oauth2Login
1340-
.clientRegistrationRepository(this.clientRegistrationRepository)
1341-
// .authorizedClientRepository(this.authorizedClientRepository)
1342-
.withObjectPostProcessor(new CustomProcessor())
1343-
);
1332+
.oauth2Login((oauth2Login) -> oauth2Login
1333+
.clientRegistrationRepository(this.clientRegistrationRepository)
1334+
.withObjectPostProcessor(this.postProcessor)
1335+
);
13441336
// @formatter:on
1345-
return super.configureFilterChain(http);
1337+
return http.build();
13461338
}
13471339

1348-
class CustomProcessor implements ObjectPostProcessor<AuthenticationProvider> {
1349-
@Override
1350-
public <O extends AuthenticationProvider> O postProcess(O object) {
1351-
AuthenticationProvider p = new NoopWrapperProvider(object);
1340+
@Bean
1341+
ObjectPostProcessor<AuthenticationProvider> mockPostProcessor() {
1342+
return this.postProcessor;
1343+
}
13521344

1353-
return (O) p;
1354-
}
1345+
@Bean
1346+
HttpSessionOAuth2AuthorizationRequestRepository oauth2AuthorizationRequestRepository() {
1347+
return new HttpSessionOAuth2AuthorizationRequestRepository();
13551348
}
13561349

1357-
record NoopWrapperProvider(
1358-
AuthenticationProvider delegate
1359-
) implements AuthenticationProvider {
1350+
static class SpyObjectPostProcessor implements ObjectPostProcessor<AuthenticationProvider> {
13601351

1361-
@Override
1362-
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
1363-
return delegate.authenticate(authentication);
1364-
}
1352+
AuthenticationProvider spy;
13651353

13661354
@Override
1367-
public boolean supports(Class<?> authentication) {
1368-
return delegate.supports(authentication);
1355+
public <O extends AuthenticationProvider> O postProcess(O object) {
1356+
O spy = Mockito.spy(object);
1357+
this.spy = spy;
1358+
return spy;
13691359
}
1360+
13701361
}
13711362

13721363
}

0 commit comments

Comments
 (0)