| 
					
				 | 
			
			
				@@ -16,17 +16,19 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 package org.springframework.security.authentication; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import static org.assertj.core.api.Assertions.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import static org.mockito.Mockito.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.junit.Test; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.context.MessageSource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.core.Authentication; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import org.springframework.security.core.AuthenticationException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.ArrayList; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.Arrays; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import java.util.Collections; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import java.util.List; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.junit.Test; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.context.MessageSource; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.security.core.Authentication; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-import org.springframework.security.core.AuthenticationException; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static org.assertj.core.api.Assertions.assertThat; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static org.assertj.core.api.Assertions.fail; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import static org.mockito.Mockito.*; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * Tests {@link ProviderManager}. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -257,7 +259,6 @@ public class ProviderManagerTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		catch (BadCredentialsException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			assertThat(e).isSameAs(expected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-		verify(publisher).publishAuthenticationFailure(expected, authReq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	@Test 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -298,6 +299,32 @@ public class ProviderManagerTests { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	// gh-6281 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	@Test 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	public void authenticateWhenFailsInParentAndPublishesThenChildDoesNotPublish() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		BadCredentialsException badCredentialsExParent = new BadCredentialsException("Bad Credentials in parent"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ProviderManager parentMgr = new ProviderManager( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+				Collections.singletonList(createProviderWhichThrows(badCredentialsExParent))); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		ProviderManager childMgr = new ProviderManager(Collections.singletonList(createProviderWhichThrows( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+						new BadCredentialsException("Bad Credentials in child"))), parentMgr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		AuthenticationEventPublisher publisher = mock(AuthenticationEventPublisher.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		parentMgr.setAuthenticationEventPublisher(publisher); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		childMgr.setAuthenticationEventPublisher(publisher); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		final Authentication authReq = mock(Authentication.class); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		try { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			childMgr.authenticate(authReq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			fail("Expected exception"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		catch (BadCredentialsException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+			assertThat(e).isSameAs(badCredentialsExParent); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		verify(publisher).publishAuthenticationFailure(badCredentialsExParent, authReq);		// Parent publishes 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+		verifyNoMoreInteractions(publisher);		// Child should not publish (duplicate event) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+	} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 	private AuthenticationProvider createProviderWhichThrows( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 			final AuthenticationException e) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 		AuthenticationProvider provider = mock(AuthenticationProvider.class); 
			 |