|
@@ -22,6 +22,7 @@ import org.junit.Rule;
|
|
|
import org.junit.Test;
|
|
|
import org.springframework.beans.factory.annotation.Autowired;
|
|
|
import org.springframework.context.annotation.Bean;
|
|
|
+import org.springframework.context.annotation.Configuration;
|
|
|
import org.springframework.security.access.AccessDeniedException;
|
|
|
import org.springframework.security.authentication.AuthenticationManager;
|
|
|
import org.springframework.security.authentication.AuthenticationTrustResolver;
|
|
@@ -44,10 +45,14 @@ import org.springframework.security.web.authentication.logout.LogoutHandler;
|
|
|
import org.springframework.security.web.authentication.logout.LogoutSuccessEventPublishingLogoutHandler;
|
|
|
import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter;
|
|
|
import org.springframework.test.web.servlet.MockMvc;
|
|
|
+import org.springframework.test.web.servlet.MvcResult;
|
|
|
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
|
import org.springframework.web.bind.annotation.RestController;
|
|
|
+import org.springframework.web.context.ConfigurableWebApplicationContext;
|
|
|
|
|
|
import javax.servlet.Filter;
|
|
|
+import javax.servlet.ServletException;
|
|
|
import javax.servlet.http.HttpServletRequest;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
|
|
@@ -60,6 +65,7 @@ import static org.springframework.security.config.Customizer.withDefaults;
|
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders.formLogin;
|
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication;
|
|
|
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.user;
|
|
|
+import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
|
|
|
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
|
|
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
|
|
|
|
|
@@ -329,6 +335,39 @@ public class ServletApiConfigurerTests {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ @Test
|
|
|
+ public void logoutServletApiWhenCsrfDisabled() throws Exception {
|
|
|
+ ConfigurableWebApplicationContext context = this.spring.register(CsrfDisabledConfig.class).getContext();
|
|
|
+ MockMvc mockMvc = MockMvcBuilders.webAppContextSetup(context)
|
|
|
+ .apply(springSecurity())
|
|
|
+ .build();
|
|
|
+ MvcResult mvcResult = mockMvc.perform(get("/"))
|
|
|
+ .andReturn();
|
|
|
+ assertThat(mvcResult.getRequest().getSession(false)).isNull();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Configuration
|
|
|
+ @EnableWebSecurity
|
|
|
+ static class CsrfDisabledConfig extends WebSecurityConfigurerAdapter {
|
|
|
+ @Override
|
|
|
+ protected void configure(HttpSecurity http) throws Exception {
|
|
|
+ // @formatter:off
|
|
|
+ http
|
|
|
+ .csrf().disable();
|
|
|
+ // @formatter:on
|
|
|
+ }
|
|
|
+
|
|
|
+ @RestController
|
|
|
+ static class LogoutController {
|
|
|
+ @GetMapping("/")
|
|
|
+ String logout(HttpServletRequest request) throws ServletException {
|
|
|
+ request.getSession().setAttribute("foo", "bar");
|
|
|
+ request.logout();
|
|
|
+ return "logout";
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
private <T extends Filter> T getFilter(Class<T> filterClass) {
|
|
|
return (T) getFilters().stream()
|
|
|
.filter(filterClass::isInstance)
|