Skip to content

Commit e77dc60

Browse files
committed
Add configuration properties for SAML2 relying party registration's ASM
This commit allows to configure the location and binding of the Assertion Consumer Service used by a SAML2 relying party. Closes gh-23746
1 parent 21f2b95 commit e77dc60

File tree

3 files changed

+48
-5
lines changed

3 files changed

+48
-5
lines changed

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

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,11 @@ public static class Registration {
5656
*/
5757
private String entityId = "{baseUrl}/saml2/service-provider-metadata/{registrationId}";
5858

59+
/**
60+
* Assertion Consumer Service.
61+
*/
62+
private final Acs acs = new Acs();
63+
5964
private final Signing signing = new Signing();
6065

6166
/**
@@ -71,6 +76,10 @@ public void setEntityId(String entityId) {
7176
this.entityId = entityId;
7277
}
7378

79+
public Acs getAcs() {
80+
return this.acs;
81+
}
82+
7483
public Signing getSigning() {
7584
return this.signing;
7685
}
@@ -79,6 +88,38 @@ public Identityprovider getIdentityprovider() {
7988
return this.identityprovider;
8089
}
8190

91+
public static class Acs {
92+
93+
/**
94+
* Assertion Consumer Service location template. Can generate its location
95+
* based on possible variables of "baseUrl", "registrationId", "baseScheme",
96+
* "baseHost", and "basePort".
97+
*/
98+
private String location = "{baseUrl}/login/saml2/sso/{registrationId}";
99+
100+
/**
101+
* Assertion Consumer Service binding.
102+
*/
103+
private Saml2MessageBinding binding = Saml2MessageBinding.POST;
104+
105+
public String getLocation() {
106+
return this.location;
107+
}
108+
109+
public void setLocation(String location) {
110+
this.location = location;
111+
}
112+
113+
public Saml2MessageBinding getBinding() {
114+
return this.binding;
115+
}
116+
117+
public void setBinding(Saml2MessageBinding binding) {
118+
this.binding = binding;
119+
}
120+
121+
}
122+
82123
public static class Signing {
83124

84125
/**

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

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration.Builder;
4343
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
4444
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrations;
45-
import org.springframework.security.saml2.provider.service.servlet.filter.Saml2WebSsoAuthenticationFilter;
4645
import org.springframework.util.Assert;
4746
import org.springframework.util.StringUtils;
4847

@@ -74,8 +73,8 @@ private RelyingPartyRegistration asRegistration(String id, Registration properti
7473
Builder builder = (usingMetadata) ? RelyingPartyRegistrations
7574
.fromMetadataLocation(properties.getIdentityprovider().getMetadataUri()).registrationId(id)
7675
: RelyingPartyRegistration.withRegistrationId(id);
77-
builder.assertionConsumerServiceLocation(
78-
"{baseUrl}" + Saml2WebSsoAuthenticationFilter.DEFAULT_FILTER_PROCESSES_URI);
76+
builder.assertionConsumerServiceLocation(properties.getAcs().getLocation());
77+
builder.assertionConsumerServiceBinding(properties.getAcs().getBinding());
7978
builder.assertingPartyDetails(mapIdentityProvider(properties, usingMetadata));
8079
builder.signingX509Credentials((credentials) -> properties.getSigning().getCredentials().stream()
8180
.map(this::asSigningCredential).forEach(credentials::add));

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

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,8 @@ void relyingPartyRegistrationRepositoryBeanShouldBeCreatedWhenPropertiesPresent(
9393
assertThat(registration.getAssertingPartyDetails().getEntityId())
9494
.isEqualTo("https://simplesaml-for-spring-saml.cfapps.io/saml2/idp/metadata.php");
9595
assertThat(registration.getAssertionConsumerServiceLocation())
96-
.isEqualTo("{baseUrl}" + Saml2WebSsoAuthenticationFilter.DEFAULT_FILTER_PROCESSES_URI);
96+
.isEqualTo("{baseUrl}/login/saml2/foo-entity-id");
97+
assertThat(registration.getAssertionConsumerServiceBinding()).isEqualTo(Saml2MessageBinding.REDIRECT);
9798
assertThat(registration.getAssertingPartyDetails().getSingleSignOnServiceBinding())
9899
.isEqualTo(Saml2MessageBinding.POST);
99100
assertThat(registration.getAssertingPartyDetails().getWantAuthnRequestsSigned()).isEqualTo(false);
@@ -186,7 +187,9 @@ private String[] getPropertyValues() {
186187
PREFIX + ".foo.identityprovider.singlesignon.sign-request=false",
187188
PREFIX + ".foo.identityprovider.entity-id=https://simplesaml-for-spring-saml.cfapps.io/saml2/idp/metadata.php",
188189
PREFIX + ".foo.identityprovider.verification.credentials[0].certificate-location=classpath:saml/certificate-location",
189-
PREFIX + ".foo.entity-id={baseUrl}/saml2/foo-entity-id" };
190+
PREFIX + ".foo.entity-id={baseUrl}/saml2/foo-entity-id",
191+
PREFIX + ".foo.acs.location={baseUrl}/login/saml2/foo-entity-id",
192+
PREFIX + ".foo.acs.binding=redirect" };
190193
}
191194

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

0 commit comments

Comments
 (0)