|
@@ -35,11 +35,13 @@ import org.springframework.core.io.support.SpringFactoriesLoader;
|
|
import org.springframework.mock.web.MockHttpSession;
|
|
import org.springframework.mock.web.MockHttpSession;
|
|
import org.springframework.security.access.AccessDeniedException;
|
|
import org.springframework.security.access.AccessDeniedException;
|
|
import org.springframework.security.authentication.TestingAuthenticationToken;
|
|
import org.springframework.security.authentication.TestingAuthenticationToken;
|
|
|
|
+import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig;
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
|
|
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
|
|
import org.springframework.security.config.test.SpringTestContext;
|
|
import org.springframework.security.config.test.SpringTestContext;
|
|
import org.springframework.security.config.test.SpringTestContextExtension;
|
|
import org.springframework.security.config.test.SpringTestContextExtension;
|
|
-import org.springframework.security.core.context.SecurityContextHolder;
|
|
|
|
|
|
+import org.springframework.security.core.Authentication;
|
|
|
|
+import org.springframework.security.core.context.SecurityContextHolderStrategy;
|
|
import org.springframework.security.core.userdetails.User;
|
|
import org.springframework.security.core.userdetails.User;
|
|
import org.springframework.security.core.userdetails.UserDetails;
|
|
import org.springframework.security.core.userdetails.UserDetails;
|
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
|
import org.springframework.security.core.userdetails.UserDetailsService;
|
|
@@ -54,6 +56,8 @@ import org.springframework.web.bind.annotation.RestController;
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
|
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
|
|
|
+import static org.mockito.Mockito.atLeastOnce;
|
|
|
|
+import static org.mockito.Mockito.verify;
|
|
import static org.springframework.security.config.Customizer.withDefaults;
|
|
import static org.springframework.security.config.Customizer.withDefaults;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
|
|
@@ -134,6 +138,22 @@ public class HttpSecurityConfigurationTests {
|
|
// @formatter:on
|
|
// @formatter:on
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ @Test
|
|
|
|
+ public void asyncDispatchWhenCustomSecurityContextHolderStrategyThenUses() throws Exception {
|
|
|
|
+ this.spring.register(DefaultWithFilterChainConfig.class, SecurityContextChangedListenerConfig.class,
|
|
|
|
+ NameController.class).autowire();
|
|
|
|
+ // @formatter:off
|
|
|
|
+ MockHttpServletRequestBuilder requestWithBob = get("/name").with(user("Bob"));
|
|
|
|
+ MvcResult mvcResult = this.mockMvc.perform(requestWithBob)
|
|
|
|
+ .andExpect(request().asyncStarted())
|
|
|
|
+ .andReturn();
|
|
|
|
+ this.mockMvc.perform(asyncDispatch(mvcResult))
|
|
|
|
+ .andExpect(status().isOk())
|
|
|
|
+ .andExpect(content().string("Bob"));
|
|
|
|
+ // @formatter:on
|
|
|
|
+ verify(this.spring.getContext().getBean(SecurityContextHolderStrategy.class), atLeastOnce()).getContext();
|
|
|
|
+ }
|
|
|
|
+
|
|
@Test
|
|
@Test
|
|
public void getWhenDefaultFilterChainBeanThenAnonymousPermitted() throws Exception {
|
|
public void getWhenDefaultFilterChainBeanThenAnonymousPermitted() throws Exception {
|
|
this.spring.register(AuthorizeRequestsConfig.class, UserDetailsConfig.class, BaseController.class).autowire();
|
|
this.spring.register(AuthorizeRequestsConfig.class, UserDetailsConfig.class, BaseController.class).autowire();
|
|
@@ -243,8 +263,8 @@ public class HttpSecurityConfigurationTests {
|
|
static class NameController {
|
|
static class NameController {
|
|
|
|
|
|
@GetMapping("/name")
|
|
@GetMapping("/name")
|
|
- Callable<String> name() {
|
|
|
|
- return () -> SecurityContextHolder.getContext().getAuthentication().getName();
|
|
|
|
|
|
+ Callable<String> name(Authentication authentication) {
|
|
|
|
+ return () -> authentication.getName();
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|