Skip to content

Commit 4070680

Browse files
Fix securityContextRepository() initialization in oauth2Login() DSL
1 parent 4f5b173 commit 4070680

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

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

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@
8787
import org.springframework.security.web.authentication.session.SessionAuthenticationException;
8888
import org.springframework.security.web.authentication.session.SessionAuthenticationStrategy;
8989
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter;
90+
import org.springframework.security.web.context.SecurityContextRepository;
9091
import org.springframework.security.web.csrf.CsrfToken;
9192
import org.springframework.security.web.savedrequest.RequestCache;
9293
import org.springframework.security.web.util.matcher.AndRequestMatcher;
@@ -176,6 +177,8 @@ public final class OAuth2LoginConfigurer<B extends HttpSecurityBuilder<B>>
176177

177178
private OAuth2AuthorizedClientRepository authorizedClientRepository;
178179

180+
private SecurityContextRepository securityContextRepository;
181+
179182
/**
180183
* Sets the repository of client registrations.
181184
* @param clientRegistrationRepository the repository of client registrations
@@ -229,6 +232,12 @@ public OAuth2LoginConfigurer<B> loginProcessingUrl(String loginProcessingUrl) {
229232
return this;
230233
}
231234

235+
@Override
236+
public OAuth2LoginConfigurer<B> securityContextRepository(SecurityContextRepository securityContextRepository) {
237+
this.securityContextRepository = securityContextRepository;
238+
return this;
239+
}
240+
232241
/**
233242
* Sets the registry for managing the OIDC client-provider session link
234243
* @param oidcSessionRegistry the {@link OidcSessionRegistry} to use
@@ -347,6 +356,9 @@ public void init(B http) throws Exception {
347356
OAuth2LoginAuthenticationFilter authenticationFilter = new OAuth2LoginAuthenticationFilter(
348357
this.getClientRegistrationRepository(), this.getAuthorizedClientRepository(), this.loginProcessingUrl);
349358
authenticationFilter.setSecurityContextHolderStrategy(getSecurityContextHolderStrategy());
359+
if (this.securityContextRepository != null) {
360+
authenticationFilter.setSecurityContextRepository(this.securityContextRepository);
361+
}
350362
this.setAuthenticationFilter(authenticationFilter);
351363
super.loginProcessingUrl(this.loginProcessingUrl);
352364
if (this.loginPage != null) {

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@
101101
import org.springframework.security.web.authentication.HttpStatusEntryPoint;
102102
import org.springframework.security.web.context.HttpRequestResponseHolder;
103103
import org.springframework.security.web.context.HttpSessionSecurityContextRepository;
104+
import org.springframework.security.web.context.NullSecurityContextRepository;
104105
import org.springframework.security.web.context.SecurityContextRepository;
105106
import org.springframework.security.web.session.HttpSessionDestroyedEvent;
106107
import org.springframework.security.web.util.matcher.RequestHeaderRequestMatcher;
@@ -110,6 +111,7 @@
110111

111112
import static org.assertj.core.api.Assertions.assertThat;
112113
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
114+
import static org.assertj.core.api.Assertions.assertThatNoException;
113115
import static org.mockito.ArgumentMatchers.any;
114116
import static org.mockito.ArgumentMatchers.anyString;
115117
import static org.mockito.BDDMockito.given;
@@ -696,6 +698,12 @@ public void oidcLoginWhenOAuth2ClientBeansConfiguredThenNotShared() throws Excep
696698
verifyNoInteractions(clientRegistrationRepository, authorizedClientRepository);
697699
}
698700

701+
// gh-16623
702+
@Test
703+
public void oauth2LoginConfigSecurityContextRepository() {
704+
assertThatNoException().isThrownBy(() -> loadConfig(OAuth2LoginConfigSecurityContextRepository.class));
705+
}
706+
699707
private void loadConfig(Class<?>... configs) {
700708
AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
701709
applicationContext.register(configs);
@@ -944,6 +952,24 @@ SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
944952

945953
}
946954

955+
@Configuration
956+
@EnableWebSecurity
957+
static class OAuth2LoginConfigSecurityContextRepository extends CommonSecurityFilterChainConfig {
958+
959+
@Bean
960+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
961+
// @formatter:off
962+
http
963+
.oauth2Login((login) -> login
964+
.clientRegistrationRepository(
965+
new InMemoryClientRegistrationRepository(GOOGLE_CLIENT_REGISTRATION))
966+
.securityContextRepository(new NullSecurityContextRepository()));
967+
// @formatter:on
968+
return super.configureFilterChain(http);
969+
}
970+
971+
}
972+
947973
@Configuration
948974
@EnableWebSecurity
949975
static class OAuth2LoginConfigCustomAuthorizationRequestResolver extends CommonSecurityFilterChainConfig {

0 commit comments

Comments
 (0)