| 
					
				 | 
			
			
				@@ -31,12 +31,14 @@ import org.springframework.mock.web.MockHttpSession; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.authentication.RememberMeAuthenticationToken; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.authentication.dao.DaoAuthenticationProvider; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.config.annotation.ObjectPostProcessor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.config.annotation.SecurityContextChangedListenerConfig; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.config.test.SpringTestContext; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.config.test.SpringTestContextExtension; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.core.context.SecurityContextHolderStrategy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.core.userdetails.PasswordEncodedUser; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.core.userdetails.User; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import org.springframework.security.core.userdetails.UserDetailsService; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -56,6 +58,7 @@ import static org.assertj.core.api.Assertions.assertThatIllegalStateException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.ArgumentMatchers.any; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.ArgumentMatchers.anyString; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.BDDMockito.given; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static org.mockito.Mockito.atLeastOnce; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.Mockito.mock; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.Mockito.spy; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import static org.mockito.Mockito.verify; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -101,7 +104,8 @@ public class RememberMeConfigurerTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public void configureWhenRegisteringObjectPostProcessorThenInvokedOnRememberMeAuthenticationFilter() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.spring.register(ObjectPostProcessorConfig.class).autowire(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		verify(ObjectPostProcessorConfig.objectPostProcessor).postProcess(any(RememberMeAuthenticationFilter.class)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		verify(this.spring.getContext().getBean(ObjectPostProcessor.class)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.postProcess(any(RememberMeAuthenticationFilter.class)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Test 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -132,6 +136,21 @@ public class RememberMeConfigurerTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.mvc.perform(request).andExpect(remembermeAuthentication); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void rememberMeWhenCustomSecurityContextHolderStrategyThenUses() throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		this.spring.register(UserDetailsServiceBeanConfig.class, SecurityContextChangedListenerConfig.class).autowire(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MvcResult mvcResult = this.mvc.perform(post("/login").with(csrf()).param("username", "user") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.param("password", "password").param("remember-me", "true")).andReturn(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		Cookie rememberMeCookie = mvcResult.getResponse().getCookie("remember-me"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// @formatter:off 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		MockHttpServletRequestBuilder request = get("/abc").cookie(rememberMeCookie); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		SecurityMockMvcResultMatchers.AuthenticatedMatcher remembermeAuthentication = authenticated() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				.withAuthentication((auth) -> assertThat(auth).isInstanceOf(RememberMeAuthenticationToken.class)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		// @formatter:on 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		this.mvc.perform(request).andExpect(remembermeAuthentication); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		verify(this.spring.getContext().getBean(SecurityContextHolderStrategy.class), atLeastOnce()).getContext(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	public void loginWhenRememberMeTrueThenRespondsWithRememberMeCookie() throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		this.spring.register(RememberMeConfig.class).autowire(); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -316,14 +335,14 @@ public class RememberMeConfigurerTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@EnableWebSecurity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	static class ObjectPostProcessorConfig extends WebSecurityConfigurerAdapter { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		static ObjectPostProcessor<Object> objectPostProcessor = spy(ReflectingObjectPostProcessor.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ObjectPostProcessor<Object> objectPostProcessor = spy(ReflectingObjectPostProcessor.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		@Override 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		protected void configure(HttpSecurity http) throws Exception { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// @formatter:off 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			http 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 				.rememberMe() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-					.userDetailsService(new AuthenticationManagerBuilder(objectPostProcessor).getDefaultUserDetailsService()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+					.userDetailsService(new AuthenticationManagerBuilder(this.objectPostProcessor).getDefaultUserDetailsService()); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			// @formatter:on 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -336,8 +355,8 @@ public class RememberMeConfigurerTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		@Bean 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		static ObjectPostProcessor<Object> objectPostProcessor() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-			return objectPostProcessor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ObjectPostProcessor<Object> objectPostProcessor() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			return this.objectPostProcessor; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 |