@ -22,6 +22,7 @@ import org.junit.Rule;
import org.junit.Test ;
import org.junit.Test ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.beans.factory.annotation.Autowired ;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Bean ;
import org.springframework.context.annotation.Configuration ;
import org.springframework.security.access.AccessDeniedException ;
import org.springframework.security.access.AccessDeniedException ;
import org.springframework.security.authentication.AuthenticationManager ;
import org.springframework.security.authentication.AuthenticationManager ;
import org.springframework.security.authentication.AuthenticationTrustResolver ;
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.authentication.logout.LogoutSuccessEventPublishingLogoutHandler ;
import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter ;
import org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter ;
import org.springframework.test.web.servlet.MockMvc ;
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.GetMapping ;
import org.springframework.web.bind.annotation.RestController ;
import org.springframework.web.bind.annotation.RestController ;
import org.springframework.web.context.ConfigurableWebApplicationContext ;
import javax.servlet.Filter ;
import javax.servlet.Filter ;
import javax.servlet.ServletException ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletRequest ;
import javax.servlet.http.HttpServletResponse ;
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.SecurityMockMvcRequestBuilders.formLogin ;
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.user ;
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.request.MockMvcRequestBuilders.get ;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status ;
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 ) {
private < T extends Filter > T getFilter ( Class < T > filterClass ) {
return ( T ) getFilters ( ) . stream ( )
return ( T ) getFilters ( ) . stream ( )
. filter ( filterClass : : isInstance )
. filter ( filterClass : : isInstance )