Skip to content

Commit 4bcc51a

Browse files
committed
Support configuration of entityId for a SAML Relying Party
Closes gh-20352
1 parent 58234d0 commit 4bcc51a

File tree

5 files changed

+39
-1
lines changed

5 files changed

+39
-1
lines changed

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/saml2/Saml2RelyingPartyProperties.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,32 @@ public Map<String, Registration> getRegistration() {
5050
*/
5151
public static class Registration {
5252

53+
/**
54+
* Relying party's EntityID.
55+
*
56+
* This value may contain a number of placeholders. They are: baseUrl,
57+
* registrationId, baseScheme, baseHost, and basePort.
58+
*
59+
* The default value is
60+
* {baseUrl}/saml2/service-provider-metadata/{registrationId}.
61+
*/
62+
private String relyingPartyEntityId = "{baseUrl}/saml2/service-provider-metadata/{registrationId}";
63+
5364
private final Signing signing = new Signing();
5465

5566
/**
5667
* Remote SAML Identity Provider.
5768
*/
5869
private Identityprovider identityprovider = new Identityprovider();
5970

71+
public String getRelyingPartyEntityId() {
72+
return this.relyingPartyEntityId;
73+
}
74+
75+
public void setRelyingPartyEntityId(String entityId) {
76+
this.relyingPartyEntityId = entityId;
77+
}
78+
6079
public Signing getSigning() {
6180
return this.signing;
6281
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/saml2/Saml2RelyingPartyRegistrationConfiguration.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ private RelyingPartyRegistration asRegistration(String id, Registration properti
7878
(details) -> details.binding(properties.getIdentityprovider().getSinglesignon().getBinding()));
7979
builder.providerDetails((details) -> details.signAuthNRequest(signRequest));
8080
builder.credentials((credentials) -> credentials.addAll(asCredentials(properties)));
81+
builder.entityId(properties.getRelyingPartyEntityId());
8182
return builder.build();
8283
}
8384

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/saml2/Saml2RelyingPartyAutoConfigurationTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ void relyingPartyRegistrationRepositoryBeanShouldBeCreatedWhenPropertiesPresent(
9090
assertThat(registration.getProviderDetails().isSignAuthNRequest()).isEqualTo(false);
9191
assertThat(registration.getSigningCredentials()).isNotNull();
9292
assertThat(registration.getVerificationCredentials()).isNotNull();
93+
assertThat(registration.getEntityId()).isEqualTo("{baseUrl}/saml2/foo-entity-id");
9394
});
9495
}
9596

@@ -147,7 +148,8 @@ private String[] getPropertyValues() {
147148
PREFIX + ".foo.identityprovider.singlesignon.binding=post",
148149
PREFIX + ".foo.identityprovider.singlesignon.sign-request=false",
149150
PREFIX + ".foo.identityprovider.entity-id=https://simplesaml-for-spring-saml.cfapps.io/saml2/idp/metadata.php",
150-
PREFIX + ".foo.identityprovider.verification.credentials[0].certificate-location=classpath:saml/certificate-location" };
151+
PREFIX + ".foo.identityprovider.verification.credentials[0].certificate-location=classpath:saml/certificate-location",
152+
PREFIX + ".foo.relying-party-entity-id={baseUrl}/saml2/foo-entity-id" };
151153
}
152154

153155
private boolean hasFilter(AssertableWebApplicationContext context, Class<? extends Filter> filter) {

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/saml2/Saml2RelyingPartyPropertiesTests.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
import org.springframework.boot.context.properties.bind.Binder;
2626
import org.springframework.boot.context.properties.source.ConfigurationPropertySource;
2727
import org.springframework.boot.context.properties.source.MapConfigurationPropertySource;
28+
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
2829
import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding;
2930

3031
import static org.assertj.core.api.Assertions.assertThat;
@@ -87,6 +88,20 @@ void customizeSsoSignRequestsIsTrueByDefault() {
8788
.isSignRequest()).isEqualTo(true);
8889
}
8990

91+
@Test
92+
void customizeRelyingPartyEntityId() {
93+
bind("spring.security.saml2.relyingparty.registration.simplesamlphp.relying-party-entity-id",
94+
"{baseUrl}/saml2/custom-entity-id");
95+
assertThat(this.properties.getRegistration().get("simplesamlphp").getRelyingPartyEntityId())
96+
.isEqualTo("{baseUrl}/saml2/custom-entity-id");
97+
}
98+
99+
@Test
100+
void customizeRelyingPartyEntityIdDefaultsToServiceProviderMetadata() {
101+
assertThat(RelyingPartyRegistration.withRegistrationId("id")).extracting("entityId")
102+
.isEqualTo(new Saml2RelyingPartyProperties.Registration().getRelyingPartyEntityId());
103+
}
104+
90105
private void bind(String name, String value) {
91106
bind(Collections.singletonMap(name, value));
92107
}

spring-boot-tests/spring-boot-smoke-tests/spring-boot-smoke-test-saml2-service-provider/src/main/resources/application.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ spring:
1515
entity-id: simplesaml
1616
singlesignon:
1717
url: https://simplesaml-for-spring-saml/SSOService.php
18+
relying-party-entity-id: "{baseUrl}/saml2/simple-relying-party"
1819
okta:
1920
signing:
2021
credentials:

0 commit comments

Comments
 (0)