|  | @@ -210,6 +210,26 @@ public class CsrfConfigurerTests {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void postWhenCsrfDisabledInLambdaThenRespondsWithOk() throws Exception {
 | 
	
		
			
				|  |  | +		this.spring.register(DisableCsrfInLambdaConfig.class, BasicController.class).autowire();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.mvc.perform(post("/"))
 | 
	
		
			
				|  |  | +				.andExpect(status().isOk());
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@EnableWebSecurity
 | 
	
		
			
				|  |  | +	static class DisableCsrfInLambdaConfig extends WebSecurityConfigurerAdapter {
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		@Override
 | 
	
		
			
				|  |  | +		protected void configure(HttpSecurity http) throws Exception {
 | 
	
		
			
				|  |  | +			// @formatter:off
 | 
	
		
			
				|  |  | +			http
 | 
	
		
			
				|  |  | +				.csrf(AbstractHttpConfigurer::disable);
 | 
	
		
			
				|  |  | +			// @formatter:on
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	// SEC-2498
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  |  	public void loginWhenCsrfDisabledThenRedirectsToPreviousPostRequest() throws Exception {
 | 
	
	
		
			
				|  | @@ -386,6 +406,40 @@ public class CsrfConfigurerTests {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void requireCsrfProtectionMatcherInLambdaWhenRequestDoesNotMatchThenRespondsWithOk() throws Exception {
 | 
	
		
			
				|  |  | +		RequireCsrfProtectionMatcherInLambdaConfig.MATCHER = mock(RequestMatcher.class);
 | 
	
		
			
				|  |  | +		this.spring.register(RequireCsrfProtectionMatcherInLambdaConfig.class, BasicController.class).autowire();
 | 
	
		
			
				|  |  | +		when(RequireCsrfProtectionMatcherInLambdaConfig.MATCHER.matches(any()))
 | 
	
		
			
				|  |  | +				.thenReturn(false);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.mvc.perform(get("/"))
 | 
	
		
			
				|  |  | +				.andExpect(status().isOk());
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void requireCsrfProtectionMatcherInLambdaWhenRequestMatchesThenRespondsWithForbidden() throws Exception {
 | 
	
		
			
				|  |  | +		RequireCsrfProtectionMatcherInLambdaConfig.MATCHER = mock(RequestMatcher.class);
 | 
	
		
			
				|  |  | +		when(RequireCsrfProtectionMatcherInLambdaConfig.MATCHER.matches(any())).thenReturn(true);
 | 
	
		
			
				|  |  | +		this.spring.register(RequireCsrfProtectionMatcherInLambdaConfig.class, BasicController.class).autowire();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.mvc.perform(get("/"))
 | 
	
		
			
				|  |  | +				.andExpect(status().isForbidden());
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@EnableWebSecurity
 | 
	
		
			
				|  |  | +	static class RequireCsrfProtectionMatcherInLambdaConfig extends WebSecurityConfigurerAdapter {
 | 
	
		
			
				|  |  | +		static RequestMatcher MATCHER;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		@Override
 | 
	
		
			
				|  |  | +		protected void configure(HttpSecurity http) throws Exception {
 | 
	
		
			
				|  |  | +			// @formatter:off
 | 
	
		
			
				|  |  | +			http
 | 
	
		
			
				|  |  | +				.csrf(csrf -> csrf.requireCsrfProtectionMatcher(MATCHER));
 | 
	
		
			
				|  |  | +			// @formatter:on
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  |  	public void getWhenCustomCsrfTokenRepositoryThenRepositoryIsUsed() throws Exception {
 | 
	
		
			
				|  |  |  		CsrfTokenRepositoryConfig.REPO = mock(CsrfTokenRepository.class);
 | 
	
	
		
			
				|  | @@ -454,6 +508,33 @@ public class CsrfConfigurerTests {
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	@Test
 | 
	
		
			
				|  |  | +	public void getWhenCustomCsrfTokenRepositoryInLambdaThenRepositoryIsUsed() throws Exception {
 | 
	
		
			
				|  |  | +		CsrfTokenRepositoryInLambdaConfig.REPO = mock(CsrfTokenRepository.class);
 | 
	
		
			
				|  |  | +		when(CsrfTokenRepositoryInLambdaConfig.REPO.loadToken(any()))
 | 
	
		
			
				|  |  | +				.thenReturn(new DefaultCsrfToken("X-CSRF-TOKEN", "_csrf", "token"));
 | 
	
		
			
				|  |  | +		this.spring.register(CsrfTokenRepositoryInLambdaConfig.class, BasicController.class).autowire();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		this.mvc.perform(get("/"))
 | 
	
		
			
				|  |  | +				.andExpect(status().isOk());
 | 
	
		
			
				|  |  | +		verify(CsrfTokenRepositoryInLambdaConfig.REPO).loadToken(any(HttpServletRequest.class));
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +	@EnableWebSecurity
 | 
	
		
			
				|  |  | +	static class CsrfTokenRepositoryInLambdaConfig extends WebSecurityConfigurerAdapter {
 | 
	
		
			
				|  |  | +		static CsrfTokenRepository REPO;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +		@Override
 | 
	
		
			
				|  |  | +		protected void configure(HttpSecurity http) throws Exception {
 | 
	
		
			
				|  |  | +			// @formatter:off
 | 
	
		
			
				|  |  | +			http
 | 
	
		
			
				|  |  | +				.formLogin()
 | 
	
		
			
				|  |  | +					.and()
 | 
	
		
			
				|  |  | +				.csrf(csrf -> csrf.csrfTokenRepository(REPO));
 | 
	
		
			
				|  |  | +			// @formatter:on
 | 
	
		
			
				|  |  | +		}
 | 
	
		
			
				|  |  | +	}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	@Test
 | 
	
		
			
				|  |  |  	public void getWhenCustomAccessDeniedHandlerThenHandlerIsUsed() throws Exception {
 | 
	
		
			
				|  |  |  		AccessDeniedHandlerConfig.DENIED_HANDLER = mock(AccessDeniedHandler.class);
 |