Skip to content

Commit ab77289

Browse files
committed
Polish DefaultSaml2AuthenticationRequestContextResolver
- Added more tests - Standardized terminology Issue gh-8360
1 parent 8c0bdd5 commit ab77289

File tree

2 files changed

+73
-31
lines changed

2 files changed

+73
-31
lines changed

saml2/saml2-service-provider/src/main/java/org/springframework/security/saml2/provider/service/web/DefaultSaml2AuthenticationRequestContextResolver.java

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -16,20 +16,21 @@
1616

1717
package org.springframework.security.saml2.provider.service.web;
1818

19+
import java.util.HashMap;
20+
import java.util.Map;
21+
import java.util.function.Function;
22+
import javax.servlet.http.HttpServletRequest;
23+
1924
import org.apache.commons.logging.Log;
2025
import org.apache.commons.logging.LogFactory;
26+
2127
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationRequestContext;
2228
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
2329
import org.springframework.util.Assert;
2430
import org.springframework.util.StringUtils;
2531
import org.springframework.web.util.UriComponents;
2632
import org.springframework.web.util.UriComponentsBuilder;
2733

28-
import javax.servlet.http.HttpServletRequest;
29-
import java.util.HashMap;
30-
import java.util.Map;
31-
import java.util.function.Function;
32-
3334
import static org.springframework.security.web.util.UrlUtils.buildFullRequestUrl;
3435
import static org.springframework.web.util.UriComponentsBuilder.fromHttpUrl;
3536

@@ -81,10 +82,6 @@ private Function<String, String> templateResolver(String applicationUri, Relying
8182
}
8283

8384
private static String resolveUrlTemplate(String template, String baseUrl, RelyingPartyRegistration relyingParty) {
84-
if (!StringUtils.hasText(template)) {
85-
return baseUrl;
86-
}
87-
8885
String entityId = relyingParty.getProviderDetails().getEntityId();
8986
String registrationId = relyingParty.getRegistrationId();
9087
Map<String, String> uriVariables = new HashMap<>();

saml2/saml2-service-provider/src/test/java/org/springframework/security/saml2/provider/service/web/DefaultSaml2AuthenticationRequestContextResolverTests.java

Lines changed: 67 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -23,44 +23,89 @@
2323
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
2424

2525
import static org.springframework.security.saml2.provider.service.servlet.filter.TestSaml2SigningCredentials.signingCredential;
26-
import static org.assertj.core.api.Assertions.*;
26+
import static org.assertj.core.api.Assertions.assertThat;
27+
import static org.assertj.core.api.Assertions.assertThatCode;
2728

29+
/**
30+
* Tests for {@link DefaultSaml2AuthenticationRequestContextResolver}
31+
*
32+
* @author Shazin Sadakath
33+
* @author Josh Cummings
34+
*/
2835
public class DefaultSaml2AuthenticationRequestContextResolverTests {
2936

30-
private static final String IDP_SSO_URL = "https://sso-url.example.com/IDP/SSO";
31-
private static final String TEMPLATE = "template";
37+
private static final String ASSERTING_PARTY_SSO_URL = "https://idp.example.com/sso";
38+
private static final String RELYING_PARTY_SSO_URL = "https://sp.example.com/sso";
39+
private static final String ASSERTING_PARTY_ENTITY_ID = "asserting-party-entity-id";
40+
private static final String RELYING_PARTY_ENTITY_ID = "relying-party-entity-id";
3241
private static final String REGISTRATION_ID = "registration-id";
33-
private static final String IDP_ENTITY_ID = "idp-entity-id";
3442

3543
private MockHttpServletRequest request;
36-
private RelyingPartyRegistration.Builder rpBuilder;
37-
private Saml2AuthenticationRequestContextResolver authenticationRequestContextResolver = new DefaultSaml2AuthenticationRequestContextResolver();
44+
private RelyingPartyRegistration.Builder relyingPartyBuilder;
45+
private Saml2AuthenticationRequestContextResolver authenticationRequestContextResolver
46+
= new DefaultSaml2AuthenticationRequestContextResolver();
3847

3948
@Before
4049
public void setup() {
41-
request = new MockHttpServletRequest();
42-
rpBuilder = RelyingPartyRegistration
50+
this.request = new MockHttpServletRequest();
51+
this.relyingPartyBuilder = RelyingPartyRegistration
4352
.withRegistrationId(REGISTRATION_ID)
44-
.providerDetails(c -> c.entityId(IDP_ENTITY_ID))
45-
.providerDetails(c -> c.webSsoUrl(IDP_SSO_URL))
46-
.assertionConsumerServiceUrlTemplate(TEMPLATE)
53+
.localEntityIdTemplate(RELYING_PARTY_ENTITY_ID)
54+
.providerDetails(c -> c.entityId(ASSERTING_PARTY_ENTITY_ID))
55+
.providerDetails(c -> c.webSsoUrl(ASSERTING_PARTY_SSO_URL))
56+
.assertionConsumerServiceUrlTemplate(RELYING_PARTY_SSO_URL)
4757
.credentials(c -> c.add(signingCredential()));
4858
}
4959

5060
@Test
51-
public void resoleWhenRequestAndRelyingPartyNotNullThenCreateSaml2AuthenticationRequestContext() {
52-
Saml2AuthenticationRequestContext authenticationRequestContext = authenticationRequestContextResolver.resolve(request, rpBuilder.build());
61+
public void resolveWhenRequestAndRelyingPartyNotNullThenCreateSaml2AuthenticationRequestContext() {
62+
this.request.addParameter("RelayState", "relay-state");
63+
RelyingPartyRegistration relyingParty = this.relyingPartyBuilder.build();
64+
Saml2AuthenticationRequestContext context =
65+
this.authenticationRequestContextResolver.resolve(this.request, relyingParty);
66+
67+
assertThat(context).isNotNull();
68+
assertThat(context.getAssertionConsumerServiceUrl()).isEqualTo(RELYING_PARTY_SSO_URL);
69+
assertThat(context.getRelayState()).isEqualTo("relay-state");
70+
assertThat(context.getDestination()).isEqualTo(ASSERTING_PARTY_SSO_URL);
71+
assertThat(context.getIssuer()).isEqualTo(RELYING_PARTY_ENTITY_ID);
72+
assertThat(context.getRelyingPartyRegistration()).isSameAs(relyingParty);
73+
}
74+
75+
@Test
76+
public void resolveWhenAssertionConsumerServiceUrlTemplateContainsRegistrationIdThenResolves() {
77+
RelyingPartyRegistration relyingParty = this.relyingPartyBuilder
78+
.assertionConsumerServiceUrlTemplate("/saml2/authenticate/{registrationId}")
79+
.build();
80+
Saml2AuthenticationRequestContext context =
81+
this.authenticationRequestContextResolver.resolve(this.request, relyingParty);
82+
83+
assertThat(context.getAssertionConsumerServiceUrl()).isEqualTo("/saml2/authenticate/registration-id");
84+
}
85+
86+
@Test
87+
public void resolveWhenAssertionConsumerServiceUrlTemplateContainsBaseUrlThenResolves() {
88+
RelyingPartyRegistration relyingParty = this.relyingPartyBuilder
89+
.assertionConsumerServiceUrlTemplate("{baseUrl}/saml2/authenticate/{registrationId}")
90+
.build();
91+
Saml2AuthenticationRequestContext context =
92+
this.authenticationRequestContextResolver.resolve(this.request, relyingParty);
5393

54-
assertThat(authenticationRequestContext).isNotNull();
55-
assertThat(authenticationRequestContext.getAssertionConsumerServiceUrl()).isEqualTo(TEMPLATE);
56-
assertThat(authenticationRequestContext.getRelyingPartyRegistration().getRegistrationId()).isEqualTo(REGISTRATION_ID);
57-
assertThat(authenticationRequestContext.getRelyingPartyRegistration().getProviderDetails().getEntityId()).isEqualTo(IDP_ENTITY_ID);
58-
assertThat(authenticationRequestContext.getRelyingPartyRegistration().getProviderDetails().getWebSsoUrl()).isEqualTo(IDP_SSO_URL);
59-
assertThat(authenticationRequestContext.getRelyingPartyRegistration().getCredentials()).isNotEmpty();
94+
assertThat(context.getAssertionConsumerServiceUrl())
95+
.isEqualTo("http://localhost/saml2/authenticate/registration-id");
6096
}
6197

62-
@Test(expected = IllegalArgumentException.class)
63-
public void resolveWhenRequestAndRelyingPartyNullThenException() {
64-
authenticationRequestContextResolver.resolve(null, null);
98+
@Test
99+
public void resolveWhenRequestNullThenException() {
100+
assertThatCode(() ->
101+
this.authenticationRequestContextResolver.resolve(this.request, null))
102+
.isInstanceOf(IllegalArgumentException.class);
103+
}
104+
105+
@Test
106+
public void resolveWhenRelyingPartyNullThenException() {
107+
assertThatCode(() ->
108+
this.authenticationRequestContextResolver.resolve(null, this.relyingPartyBuilder.build()))
109+
.isInstanceOf(IllegalArgumentException.class);
65110
}
66111
}

0 commit comments

Comments
 (0)