|
|
|
@ -20,6 +20,7 @@ import java.io.InputStream;
|
|
|
|
|
import java.security.cert.CertificateFactory;
|
|
|
|
|
import java.security.cert.X509Certificate;
|
|
|
|
|
import java.security.interfaces.RSAPrivateKey;
|
|
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.function.Consumer;
|
|
|
|
@ -63,6 +64,7 @@ import org.springframework.util.StringUtils;
|
|
|
|
|
* @author Madhura Bhave
|
|
|
|
|
* @author Phillip Webb
|
|
|
|
|
* @author Moritz Halbritter
|
|
|
|
|
* @author Lasse Lindqvist
|
|
|
|
|
*/
|
|
|
|
|
@Configuration(proxyBeanMethods = false)
|
|
|
|
|
@Conditional(RegistrationConfiguredCondition.class)
|
|
|
|
@ -88,14 +90,8 @@ class Saml2RelyingPartyRegistrationConfiguration {
|
|
|
|
|
private RelyingPartyRegistration asRegistration(String id, Registration properties) {
|
|
|
|
|
AssertingPartyProperties assertingParty = new AssertingPartyProperties(properties, id);
|
|
|
|
|
boolean usingMetadata = StringUtils.hasText(assertingParty.getMetadataUri());
|
|
|
|
|
Builder builder = (usingMetadata) ? RelyingPartyRegistrations
|
|
|
|
|
.collectionFromMetadataLocation(properties.getAssertingparty().getMetadataUri())
|
|
|
|
|
.stream()
|
|
|
|
|
.filter(b -> entityIdsMatch(properties, b))
|
|
|
|
|
.findFirst()
|
|
|
|
|
.orElseThrow(() -> new IllegalStateException(
|
|
|
|
|
"No relying party with entity-id " + properties.getEntityId() + " found."))
|
|
|
|
|
.registrationId(id) : RelyingPartyRegistration.withRegistrationId(id);
|
|
|
|
|
Builder builder = (!usingMetadata) ? RelyingPartyRegistration.withRegistrationId(id)
|
|
|
|
|
: createBuilderUsingMetadata(id, assertingParty).registrationId(id);
|
|
|
|
|
builder.assertionConsumerServiceLocation(properties.getAcs().getLocation());
|
|
|
|
|
builder.assertionConsumerServiceBinding(properties.getAcs().getBinding());
|
|
|
|
|
builder.assertingPartyDetails(mapAssertingParty(properties, id, usingMetadata));
|
|
|
|
@ -124,17 +120,23 @@ class Saml2RelyingPartyRegistrationConfiguration {
|
|
|
|
|
return registration;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* Tests if the builder would have the correct entity-id. If no entity-id is given in
|
|
|
|
|
* properties, any builder passes the test.
|
|
|
|
|
* @param properties the properties
|
|
|
|
|
* @param b the builder
|
|
|
|
|
* @return true if the builder passes the test
|
|
|
|
|
*/
|
|
|
|
|
private boolean entityIdsMatch(Registration properties, Builder b) {
|
|
|
|
|
RelyingPartyRegistration rpr = b.build();
|
|
|
|
|
return properties.getAssertingparty().getEntityId() == null
|
|
|
|
|
|| properties.getAssertingparty().getEntityId().equals(rpr.getAssertingPartyDetails().getEntityId());
|
|
|
|
|
private RelyingPartyRegistration.Builder createBuilderUsingMetadata(String id,
|
|
|
|
|
AssertingPartyProperties properties) {
|
|
|
|
|
String requiredEntityId = properties.getEntityId();
|
|
|
|
|
Collection<Builder> candidates = RelyingPartyRegistrations
|
|
|
|
|
.collectionFromMetadataLocation(properties.getMetadataUri());
|
|
|
|
|
for (RelyingPartyRegistration.Builder candidate : candidates) {
|
|
|
|
|
if (requiredEntityId == null || requiredEntityId.equals(getEntityId(candidate))) {
|
|
|
|
|
return candidate;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
throw new IllegalStateException("No relying party with Entity ID '" + requiredEntityId + "' found");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Object getEntityId(RelyingPartyRegistration.Builder candidate) {
|
|
|
|
|
String[] result = new String[1];
|
|
|
|
|
candidate.assertingPartyDetails((builder) -> result[0] = builder.build().getEntityId());
|
|
|
|
|
return result[0];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Consumer<AssertingPartyDetails.Builder> mapAssertingParty(Registration registration, String id,
|
|
|
|
|