Fix to save all values for multi-valued request parameters

Fixes gh-1250
This commit is contained in:
Martin Lindström
2023-05-31 20:18:35 +02:00
committed by Joe Grandja
parent 4bb741b0ba
commit 890b1ef0ed
15 changed files with 53 additions and 19 deletions

View File

@@ -84,7 +84,7 @@ public final class OAuth2AuthorizationCodeAuthenticationConverter implements Aut
!key.equals(OAuth2ParameterNames.CLIENT_ID) &&
!key.equals(OAuth2ParameterNames.CODE) &&
!key.equals(OAuth2ParameterNames.REDIRECT_URI)) {
additionalParameters.put(key, value.get(0));
additionalParameters.put(key, value.size() == 1 ? value.get(0) : value.toArray(new String[0]));
}
});

View File

@@ -138,7 +138,7 @@ public final class OAuth2AuthorizationCodeRequestAuthenticationConverter impleme
!key.equals(OAuth2ParameterNames.REDIRECT_URI) &&
!key.equals(OAuth2ParameterNames.SCOPE) &&
!key.equals(OAuth2ParameterNames.STATE)) {
additionalParameters.put(key, value.get(0));
additionalParameters.put(key, value.size() == 1 ? value.get(0) : value.toArray(new String[0]));
}
});

View File

@@ -93,7 +93,7 @@ public final class OAuth2AuthorizationConsentAuthenticationConverter implements
if (!key.equals(OAuth2ParameterNames.CLIENT_ID) &&
!key.equals(OAuth2ParameterNames.STATE) &&
!key.equals(OAuth2ParameterNames.SCOPE)) {
additionalParameters.put(key, value.get(0));
additionalParameters.put(key, value.size() == 1 ? value.get(0) : value.toArray(new String[0]));
}
});

View File

@@ -79,7 +79,7 @@ public final class OAuth2ClientCredentialsAuthenticationConverter implements Aut
parameters.forEach((key, value) -> {
if (!key.equals(OAuth2ParameterNames.GRANT_TYPE) &&
!key.equals(OAuth2ParameterNames.SCOPE)) {
additionalParameters.put(key, value.get(0));
additionalParameters.put(key, value.size() == 1 ? value.get(0) : value.toArray(new String[0]));
}
});

View File

@@ -16,8 +16,8 @@
package org.springframework.security.oauth2.server.authorization.web.authentication;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
@@ -58,11 +58,13 @@ final class OAuth2EndpointUtils {
if (!matchesAuthorizationCodeGrantRequest(request)) {
return Collections.emptyMap();
}
Map<String, Object> parameters = new HashMap<>(getParameters(request).toSingleValueMap());
MultiValueMap<String, String> parameters = getParameters(request);
for (String exclusion : exclusions) {
parameters.remove(exclusion);
}
return parameters;
return parameters.entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey,
e -> e.getValue().size() == 1 ? e.getValue().get(0) : e.getValue().toArray(new String[0])));
}
static boolean matchesAuthorizationCodeGrantRequest(HttpServletRequest request) {

View File

@@ -90,7 +90,7 @@ public final class OAuth2RefreshTokenAuthenticationConverter implements Authenti
if (!key.equals(OAuth2ParameterNames.GRANT_TYPE) &&
!key.equals(OAuth2ParameterNames.REFRESH_TOKEN) &&
!key.equals(OAuth2ParameterNames.SCOPE)) {
additionalParameters.put(key, value.get(0));
additionalParameters.put(key, value.size() == 1 ? value.get(0) : value.toArray(new String[0]));
}
});

View File

@@ -69,7 +69,7 @@ public final class OAuth2TokenIntrospectionAuthenticationConverter implements Au
parameters.forEach((key, value) -> {
if (!key.equals(OAuth2ParameterNames.TOKEN) &&
!key.equals(OAuth2ParameterNames.TOKEN_TYPE_HINT)) {
additionalParameters.put(key, value.get(0));
additionalParameters.put(key, value.size() == 1 ? value.get(0) : value.toArray(new String[0]));
}
});

View File

@@ -16,6 +16,7 @@
package org.springframework.security.oauth2.server.authorization.web.authentication;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
@@ -68,7 +69,12 @@ public final class PublicClientAuthenticationConverter implements Authentication
parameters.remove(OAuth2ParameterNames.CLIENT_ID);
Map<String, Object> additionalParameters = new HashMap<>();
parameters.forEach((key, value) -> {
additionalParameters.put(key, value.size() == 1 ? value.get(0) : value.toArray(new String[0]));
});
return new OAuth2ClientAuthenticationToken(clientId, ClientAuthenticationMethod.NONE, null,
new HashMap<>(parameters.toSingleValueMap()));
additionalParameters);
}
}