Skip to content

Commit 8aa56ab

Browse files
eleftheriaskostya05983
authored andcommitted
Allow configuration of security context through nested builder
Issue: spring-projectsgh-5557
1 parent b986779 commit 8aa56ab

File tree

2 files changed

+135
-0
lines changed

2 files changed

+135
-0
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/builders/HttpSecurity.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import org.springframework.security.web.PortMapperImpl;
6363
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
6464
import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
65+
import org.springframework.security.web.context.SecurityContextRepository;
6566
import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher;
6667
import org.springframework.security.web.session.HttpSessionEventPublisher;
6768
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
@@ -1248,6 +1249,39 @@ public SecurityContextConfigurer<HttpSecurity> securityContext() throws Exceptio
12481249
return getOrApply(new SecurityContextConfigurer<>());
12491250
}
12501251

1252+
/**
1253+
* Sets up management of the {@link SecurityContext} on the
1254+
* {@link SecurityContextHolder} between {@link HttpServletRequest}'s. This is
1255+
* automatically applied when using {@link WebSecurityConfigurerAdapter}.
1256+
*
1257+
* The following customization specifies the shared {@link SecurityContextRepository}
1258+
*
1259+
* <pre>
1260+
* &#064;Configuration
1261+
* &#064;EnableWebSecurity
1262+
* public class SecurityContextSecurityConfig extends WebSecurityConfigurerAdapter {
1263+
*
1264+
* &#064;Override
1265+
* protected void configure(HttpSecurity http) throws Exception {
1266+
* http
1267+
* .securityContext(securityContext ->
1268+
* securityContext
1269+
* .securityContextRepository(SCR)
1270+
* );
1271+
* }
1272+
* }
1273+
* </pre>
1274+
*
1275+
* @param securityContextCustomizer the {@link Customizer} to provide more options for
1276+
* the {@link SecurityContextConfigurer}
1277+
* @return the {@link HttpSecurity} for further customizations
1278+
* @throws Exception
1279+
*/
1280+
public HttpSecurity securityContext(Customizer<SecurityContextConfigurer<HttpSecurity>> securityContextCustomizer) throws Exception {
1281+
securityContextCustomizer.customize(getOrApply(new SecurityContextConfigurer<>()));
1282+
return HttpSecurity.this;
1283+
}
1284+
12511285
/**
12521286
* Integrates the {@link HttpServletRequest} methods with the values found on the
12531287
* {@link SecurityContext}. This is automatically applied when using

config/src/test/java/org/springframework/security/config/annotation/web/configurers/SecurityContextConfigurerTests.java

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,14 +28,22 @@
2828
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
2929
import org.springframework.security.config.test.SpringTestRule;
3030
import org.springframework.security.core.context.SecurityContext;
31+
import org.springframework.security.core.userdetails.PasswordEncodedUser;
3132
import org.springframework.security.web.context.HttpRequestResponseHolder;
33+
import org.springframework.security.web.context.NullSecurityContextRepository;
3234
import org.springframework.security.web.context.SecurityContextPersistenceFilter;
3335
import org.springframework.security.web.context.SecurityContextRepository;
3436
import org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter;
3537
import org.springframework.test.web.servlet.MockMvc;
38+
import org.springframework.test.web.servlet.MvcResult;
3639

40+
import javax.servlet.http.HttpSession;
41+
42+
import static org.assertj.core.api.Assertions.assertThat;
3743
import static org.mockito.ArgumentMatchers.any;
3844
import static org.mockito.Mockito.*;
45+
import static org.springframework.security.config.Customizer.withDefaults;
46+
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin;
3947
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
4048

4149
/**
@@ -151,4 +159,97 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
151159
// @formatter:on
152160
}
153161
}
162+
163+
@Test
164+
public void requestWhenSecurityContextWithDefaultsInLambdaThenSessionIsCreated() throws Exception {
165+
this.spring.register(SecurityContextWithDefaultsInLambdaConfig.class).autowire();
166+
167+
MvcResult mvcResult = this.mvc.perform(formLogin()).andReturn();
168+
HttpSession session = mvcResult.getRequest().getSession(false);
169+
assertThat(session).isNotNull();
170+
}
171+
172+
@EnableWebSecurity
173+
static class SecurityContextWithDefaultsInLambdaConfig extends WebSecurityConfigurerAdapter {
174+
@Override
175+
protected void configure(HttpSecurity http) throws Exception {
176+
// @formatter:off
177+
http
178+
.formLogin(withDefaults())
179+
.securityContext(withDefaults());
180+
// @formatter:on
181+
}
182+
183+
@Override
184+
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
185+
// @formatter:off
186+
auth
187+
.inMemoryAuthentication()
188+
.withUser(PasswordEncodedUser.user());
189+
// @formatter:on
190+
}
191+
}
192+
193+
@Test
194+
public void requestWhenSecurityContextDisabledInLambdaThenContextNotSavedInSession() throws Exception {
195+
this.spring.register(SecurityContextDisabledInLambdaConfig.class).autowire();
196+
197+
MvcResult mvcResult = this.mvc.perform(formLogin()).andReturn();
198+
HttpSession session = mvcResult.getRequest().getSession(false);
199+
assertThat(session).isNull();
200+
}
201+
202+
@EnableWebSecurity
203+
static class SecurityContextDisabledInLambdaConfig extends WebSecurityConfigurerAdapter {
204+
@Override
205+
protected void configure(HttpSecurity http) throws Exception {
206+
// @formatter:off
207+
http
208+
.formLogin(withDefaults())
209+
.securityContext(AbstractHttpConfigurer::disable);
210+
// @formatter:on
211+
}
212+
213+
@Override
214+
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
215+
// @formatter:off
216+
auth
217+
.inMemoryAuthentication()
218+
.withUser(PasswordEncodedUser.user());
219+
// @formatter:on
220+
}
221+
}
222+
223+
@Test
224+
public void requestWhenNullSecurityContextRepositoryInLambdaThenContextNotSavedInSession() throws Exception {
225+
this.spring.register(NullSecurityContextRepositoryInLambdaConfig.class).autowire();
226+
227+
MvcResult mvcResult = this.mvc.perform(formLogin()).andReturn();
228+
HttpSession session = mvcResult.getRequest().getSession(false);
229+
assertThat(session).isNull();
230+
}
231+
232+
@EnableWebSecurity
233+
static class NullSecurityContextRepositoryInLambdaConfig extends WebSecurityConfigurerAdapter {
234+
@Override
235+
protected void configure(HttpSecurity http) throws Exception {
236+
// @formatter:off
237+
http
238+
.formLogin(withDefaults())
239+
.securityContext(securityContext ->
240+
securityContext
241+
.securityContextRepository(new NullSecurityContextRepository())
242+
);
243+
// @formatter:on
244+
}
245+
246+
@Override
247+
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
248+
// @formatter:off
249+
auth
250+
.inMemoryAuthentication()
251+
.withUser(PasswordEncodedUser.user());
252+
// @formatter:on
253+
}
254+
}
154255
}

0 commit comments

Comments
 (0)