Replace Streams with Loops
First version of replacing streams fix wwwAuthenticate and codestyle fix errors in implementation to pass tests Fix review notes Remove uneccessary final to align with cb Short circuit way to authorize Simplify error message, make code readably Return error while duplicate key found Delete check for duplicate, checkstyle issues Return duplicate error Fixes gh-7154
This commit is contained in:
committed by
Josh Cummings
parent
d6d0d89ff8
commit
f6c650db47
@@ -22,7 +22,6 @@ import reactor.core.publisher.Mono;
|
||||
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
/**
|
||||
* A {@link ReactiveAuthorizationManager} that determines if the current user is
|
||||
@@ -109,9 +108,14 @@ public class AuthorityReactiveAuthorizationManager<T> implements ReactiveAuthori
|
||||
Assert.notNull(role, "role cannot be null");
|
||||
}
|
||||
|
||||
return hasAnyAuthority(Stream.of(roles)
|
||||
.map(r -> "ROLE_" + r)
|
||||
.toArray(String[]::new)
|
||||
);
|
||||
return hasAnyAuthority(toNamedRolesArray(roles));
|
||||
}
|
||||
|
||||
private static String[] toNamedRolesArray(String... roles) {
|
||||
String[] result = new String[roles.length];
|
||||
for (int i=0; i < roles.length; i++) {
|
||||
result[i] = "ROLE_" + roles[i];
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
package org.springframework.security.converter;
|
||||
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStream;
|
||||
import java.io.BufferedReader;
|
||||
import java.io.InputStreamReader;
|
||||
import java.security.KeyFactory;
|
||||
import java.security.NoSuchAlgorithmException;
|
||||
@@ -25,8 +25,8 @@ import java.security.interfaces.RSAPrivateKey;
|
||||
import java.security.interfaces.RSAPublicKey;
|
||||
import java.security.spec.PKCS8EncodedKeySpec;
|
||||
import java.security.spec.X509EncodedKeySpec;
|
||||
import java.util.Base64;
|
||||
import java.util.List;
|
||||
import java.util.Base64;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import org.springframework.core.convert.converter.Converter;
|
||||
@@ -66,10 +66,13 @@ public class RsaKeyConverters {
|
||||
Assert.isTrue(!lines.isEmpty() && lines.get(0).startsWith(PKCS8_PEM_HEADER),
|
||||
"Key is not in PEM-encoded PKCS#8 format, " +
|
||||
"please check that the header begins with -----" + PKCS8_PEM_HEADER + "-----");
|
||||
String base64Encoded = lines.stream()
|
||||
.filter(RsaKeyConverters::isNotPkcs8Wrapper)
|
||||
.collect(Collectors.joining());
|
||||
byte[] pkcs8 = Base64.getDecoder().decode(base64Encoded);
|
||||
StringBuilder base64Encoded = new StringBuilder();
|
||||
for (String line : lines) {
|
||||
if (RsaKeyConverters.isNotPkcs8Wrapper(line)) {
|
||||
base64Encoded.append(line);
|
||||
}
|
||||
}
|
||||
byte[] pkcs8 = Base64.getDecoder().decode(base64Encoded.toString());
|
||||
|
||||
try {
|
||||
return (RSAPrivateKey) keyFactory.generatePrivate(
|
||||
@@ -97,10 +100,13 @@ public class RsaKeyConverters {
|
||||
Assert.isTrue(!lines.isEmpty() && lines.get(0).startsWith(X509_PEM_HEADER),
|
||||
"Key is not in PEM-encoded X.509 format, " +
|
||||
"please check that the header begins with -----" + X509_PEM_HEADER + "-----");
|
||||
String base64Encoded = lines.stream()
|
||||
.filter(RsaKeyConverters::isNotX509Wrapper)
|
||||
.collect(Collectors.joining());
|
||||
byte[] x509 = Base64.getDecoder().decode(base64Encoded);
|
||||
StringBuilder base64Encoded = new StringBuilder();
|
||||
for (String line : lines) {
|
||||
if (RsaKeyConverters.isNotX509Wrapper(line)) {
|
||||
base64Encoded.append(line);
|
||||
}
|
||||
}
|
||||
byte[] x509 = Base64.getDecoder().decode(base64Encoded.toString());
|
||||
|
||||
try {
|
||||
return (RSAPublicKey) keyFactory.generatePublic(
|
||||
|
||||
@@ -19,8 +19,7 @@ package org.springframework.security.core.userdetails;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collection;
|
||||
import java.util.Map;
|
||||
import java.util.function.Function;
|
||||
import java.util.stream.Collectors;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import reactor.core.publisher.Mono;
|
||||
@@ -56,7 +55,10 @@ public class MapReactiveUserDetailsService implements ReactiveUserDetailsService
|
||||
*/
|
||||
public MapReactiveUserDetailsService(Collection<UserDetails> users) {
|
||||
Assert.notEmpty(users, "users cannot be null or empty");
|
||||
this.users = users.stream().collect(Collectors.toConcurrentMap( u -> getKey(u.getUsername()), Function.identity()));
|
||||
this.users = new ConcurrentHashMap<>();
|
||||
for (UserDetails user : users) {
|
||||
this.users.put(getKey(user.getUsername()), user);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -46,6 +46,13 @@ public class MapReactiveUserDetailsServiceTests {
|
||||
new MapReactiveUserDetailsService(users);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void constructorCaseIntensiveKey() {
|
||||
UserDetails userDetails = User.withUsername("USER").password("password").roles("USER").build();
|
||||
MapReactiveUserDetailsService userDetailsService = new MapReactiveUserDetailsService(userDetails);
|
||||
assertThat(userDetailsService.findByUsername("user").block()).isEqualTo(userDetails);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void findByUsernameWhenFoundThenReturns() {
|
||||
assertThat((users.findByUsername(USER_DETAILS.getUsername()).block())).isEqualTo(USER_DETAILS);
|
||||
|
||||
Reference in New Issue
Block a user