Skip to content

Commit d15861d

Browse files
committed
Polish Post-Processor Test
Issue gh-17175
1 parent 8601f61 commit d15861d

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;
@@ -218,28 +219,6 @@ public void oauth2Login() throws Exception {
218219
.hasToString("OAUTH2_USER");
219220
}
220221

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

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

13361331
@Configuration
13371332
@EnableWebSecurity
1338-
static class OAuth2LoginConfigCustomWithPostProcessor
1339-
extends CommonLambdaSecurityFilterChainConfig {
1333+
static class OAuth2LoginConfigCustomWithPostProcessor {
13401334

1341-
private ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
1335+
private final ClientRegistrationRepository clientRegistrationRepository = new InMemoryClientRegistrationRepository(
13421336
GOOGLE_CLIENT_REGISTRATION);
13431337

1344-
OAuth2AuthorizationRequestResolver resolver = mock(OAuth2AuthorizationRequestResolver.class);
1338+
private final ObjectPostProcessor<AuthenticationProvider> postProcessor = new SpyObjectPostProcessor();
13451339

13461340
@Bean
13471341
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
13481342
// @formatter:off
13491343
http
1350-
.oauth2Login((oauth2Login) ->
1351-
oauth2Login
1352-
.clientRegistrationRepository(this.clientRegistrationRepository)
1353-
// .authorizedClientRepository(this.authorizedClientRepository)
1354-
.withObjectPostProcessor(new CustomProcessor())
1355-
);
1344+
.oauth2Login((oauth2Login) -> oauth2Login
1345+
.clientRegistrationRepository(this.clientRegistrationRepository)
1346+
.withObjectPostProcessor(this.postProcessor)
1347+
);
13561348
// @formatter:on
1357-
return super.configureFilterChain(http);
1349+
return http.build();
13581350
}
13591351

1360-
class CustomProcessor implements ObjectPostProcessor<AuthenticationProvider> {
1361-
@Override
1362-
public <O extends AuthenticationProvider> O postProcess(O object) {
1363-
AuthenticationProvider p = new NoopWrapperProvider(object);
1352+
@Bean
1353+
ObjectPostProcessor<AuthenticationProvider> mockPostProcessor() {
1354+
return this.postProcessor;
1355+
}
13641356

1365-
return (O) p;
1366-
}
1357+
@Bean
1358+
HttpSessionOAuth2AuthorizationRequestRepository oauth2AuthorizationRequestRepository() {
1359+
return new HttpSessionOAuth2AuthorizationRequestRepository();
13671360
}
13681361

1369-
record NoopWrapperProvider(
1370-
AuthenticationProvider delegate
1371-
) implements AuthenticationProvider {
1362+
static class SpyObjectPostProcessor implements ObjectPostProcessor<AuthenticationProvider> {
13721363

1373-
@Override
1374-
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
1375-
return delegate.authenticate(authentication);
1376-
}
1364+
AuthenticationProvider spy;
13771365

13781366
@Override
1379-
public boolean supports(Class<?> authentication) {
1380-
return delegate.supports(authentication);
1367+
public <O extends AuthenticationProvider> O postProcess(O object) {
1368+
O spy = Mockito.spy(object);
1369+
this.spy = spy;
1370+
return spy;
13811371
}
1372+
13821373
}
13831374

13841375
}

0 commit comments

Comments
 (0)