소스 검색

Polish

DelegatingPasswordEncoder copies the provided Map. This ensures that
references to the Map do not update the state of DelegatingPasswordEncoder
and NullPointerException is avoided for implementations that do not allow
a null key.

Issue: gh-4936
Rob Winch 7 년 전
부모
커밋
22737dce7e

+ 3 - 6
crypto/src/main/java/org/springframework/security/crypto/password/DelegatingPasswordEncoder.java

@@ -16,6 +16,7 @@
 
 package org.springframework.security.crypto.password;
 
+import java.util.HashMap;
 import java.util.Map;
 
 /**
@@ -155,7 +156,7 @@ public class DelegatingPasswordEncoder implements PasswordEncoder {
 		}
 		this.idForEncode = idForEncode;
 		this.passwordEncoderForEncode = idToPasswordEncoder.get(idForEncode);
-		this.idToPasswordEncoder = idToPasswordEncoder;
+		this.idToPasswordEncoder = new HashMap<>(idToPasswordEncoder);
 	}
 
 	/**
@@ -191,11 +192,7 @@ public class DelegatingPasswordEncoder implements PasswordEncoder {
 			return true;
 		}
 		String id = extractId(prefixEncodedPassword);
-		PasswordEncoder delegate = null;
-		try {
-			delegate = this.idToPasswordEncoder.get(id);
-		} catch(NullPointerException e) {
-		}
+		PasswordEncoder delegate = this.idToPasswordEncoder.get(id);
 		if(delegate == null) {
 			return this.defaultPasswordEncoderForMatches
 				.matches(rawPassword, prefixEncodedPassword);

+ 3 - 7
crypto/src/test/java/org/springframework/security/crypto/password/DelegatingPasswordEncoderTests.java

@@ -23,6 +23,7 @@ import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
 
 import java.util.HashMap;
+import java.util.Hashtable;
 import java.util.Map;
 
 import static org.assertj.core.api.Assertions.assertThat;
@@ -47,9 +48,6 @@ public class DelegatingPasswordEncoderTests {
 	@Mock
 	private PasswordEncoder invalidId;
 
-	@Mock
-	private Map<String, PasswordEncoder> throwingDelegates;
-
 	private String bcryptId = "bcrypt";
 
 	private String rawPassword = "password";
@@ -173,11 +171,9 @@ public class DelegatingPasswordEncoderTests {
 
 	@Test
 	public void matchesWhenIdIsNullThenFalse() {
-		when(this.throwingDelegates.containsKey(this.bcryptId)).thenReturn(true);
-		when(this.throwingDelegates.get(this.bcryptId)).thenReturn(this.bcrypt);
-		when(this.throwingDelegates.get(null)).thenThrow(NullPointerException.class);
+		this.delegates = new Hashtable<>(this.delegates);
 
-		DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(this.bcryptId, throwingDelegates);
+		DelegatingPasswordEncoder passwordEncoder = new DelegatingPasswordEncoder(this.bcryptId, this.delegates);
 
 		assertThatThrownBy(() -> passwordEncoder.matches(this.rawPassword, this.rawPassword))
 			.isInstanceOf(IllegalArgumentException.class)