Skip to content

Commit 55047fd

Browse files
committed
Revert "Add RelyingPartyRegistrationResolver"
This reverts commit 2f734a0.
1 parent 37b4047 commit 55047fd

File tree

7 files changed

+33
-172
lines changed

7 files changed

+33
-172
lines changed

docs/manual/src/docs/asciidoc/_includes/servlet/saml2/saml2-login.adoc

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -555,24 +555,19 @@ There are a number of reasons you may want to customize. Among them:
555555
* You may know that you will never be a multi-tenant application and so want to have a simpler URL scheme
556556
* You may identify tenants in a way other than by the URI path
557557

558-
To customize the way that a `RelyingPartyRegistration` is resolved, you can configure a custom `RelyingPartyRegistrationResolver`.
558+
To customize the way that a `RelyingPartyRegistration` is resolved, you can configure a custom `Converter<HttpServletRequest, RelyingPartyRegistration>`.
559559
The default looks up the registration id from the URI's last path element and looks it up in your `RelyingPartyRegistrationRepository`.
560560

561561
You can provide a simpler resolver that, for example, always returns the same relying party:
562562

563563
[source,java]
564564
----
565-
public class SingleRelyingPartyRegistrationResolver implements RelyingPartyRegistrationResolver {
566-
567-
private final RelyingPartyRegistrationResolver delegate;
568-
569-
public SingleRelyingPartyRegistrationResolver(RelyingPartyRegistrationRepository registrations) {
570-
this.delegate = new DefaultRelyingPartyRegistrationResolver(registrations);
571-
}
565+
public class SingleRelyingPartyRegistrationResolver
566+
implements Converter<HttpServletRequest, RelyingPartyRegistration> {
572567
573568
@Override
574-
public RelyingPartyRegistration resolve(HttpServletRequest request, String registrationId) {
575-
return this.delegate.resolve(request, "single");
569+
public RelyingPartyRegistration convert(HttpServletRequest request) {
570+
return this.relyingParty;
576571
}
577572
}
578573
----
@@ -1020,7 +1015,7 @@ You can publish a metadata endpoint by adding the `Saml2MetadataFilter` to the f
10201015

10211016
[source,java]
10221017
----
1023-
DefaultRelyingPartyRegistrationResolver relyingPartyRegistrationResolver =
1018+
Converter<HttpServletRequest, RelyingPartyRegistration> relyingPartyRegistrationResolver =
10241019
new DefaultRelyingPartyRegistrationResolver(this.relyingPartyRegistrationRepository);
10251020
Saml2MetadataFilter filter = new Saml2MetadataFilter(
10261021
relyingPartyRegistrationResolver,
@@ -1040,9 +1035,11 @@ You can change this by calling the `setRequestMatcher` method on the filter:
10401035

10411036
[source,java]
10421037
----
1043-
filter.setRequestMatcher(new AntPathRequestMatcher("/saml2/{registrationId}/metadata", "GET"));
1038+
filter.setRequestMatcher(new AntPathRequestMatcher("/saml2/metadata/{registrationId}", "GET"));
10441039
----
10451040

1041+
ensuring that the `registrationId` hint is at the end of the path.
1042+
10461043
Or, if you have registered a custom relying party registration resolver in the constructor, then you can specify a path without a `registrationId` hint, like so:
10471044

10481045
[source,java]

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

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -42,42 +42,28 @@
4242
* @since 5.4
4343
*/
4444
public final class DefaultRelyingPartyRegistrationResolver
45-
implements Converter<HttpServletRequest, RelyingPartyRegistration>, RelyingPartyRegistrationResolver {
45+
implements Converter<HttpServletRequest, RelyingPartyRegistration> {
4646

4747
private static final char PATH_DELIMITER = '/';
4848

4949
private final RelyingPartyRegistrationRepository relyingPartyRegistrationRepository;
5050

51-
private final RequestMatcher registrationRequestMatcher = new AntPathRequestMatcher("/**/{registrationId}");
51+
private final Converter<HttpServletRequest, String> registrationIdResolver = new RegistrationIdResolver();
5252

5353
public DefaultRelyingPartyRegistrationResolver(
5454
RelyingPartyRegistrationRepository relyingPartyRegistrationRepository) {
5555
Assert.notNull(relyingPartyRegistrationRepository, "relyingPartyRegistrationRepository cannot be null");
5656
this.relyingPartyRegistrationRepository = relyingPartyRegistrationRepository;
5757
}
5858

59-
/**
60-
* {@inheritDoc}
61-
*/
6259
@Override
6360
public RelyingPartyRegistration convert(HttpServletRequest request) {
64-
return resolve(request, null);
65-
}
66-
67-
/**
68-
* {@inheritDoc}
69-
*/
70-
@Override
71-
public RelyingPartyRegistration resolve(HttpServletRequest request, String relyingPartyRegistrationId) {
72-
if (relyingPartyRegistrationId == null) {
73-
relyingPartyRegistrationId = this.registrationRequestMatcher.matcher(request).getVariables()
74-
.get("registrationId");
75-
}
76-
if (relyingPartyRegistrationId == null) {
61+
String registrationId = this.registrationIdResolver.convert(request);
62+
if (registrationId == null) {
7763
return null;
7864
}
7965
RelyingPartyRegistration relyingPartyRegistration = this.relyingPartyRegistrationRepository
80-
.findByRegistrationId(relyingPartyRegistrationId);
66+
.findByRegistrationId(registrationId);
8167
if (relyingPartyRegistration == null) {
8268
return null;
8369
}
@@ -125,4 +111,16 @@ private static String getApplicationUri(HttpServletRequest request) {
125111
return uriComponents.toUriString();
126112
}
127113

114+
private static class RegistrationIdResolver implements Converter<HttpServletRequest, String> {
115+
116+
private final RequestMatcher requestMatcher = new AntPathRequestMatcher("/**/{registrationId}");
117+
118+
@Override
119+
public String convert(HttpServletRequest request) {
120+
RequestMatcher.MatchResult result = this.requestMatcher.matcher(request);
121+
return result.getVariables().get("registrationId");
122+
}
123+
124+
}
125+
128126
}

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

Lines changed: 0 additions & 46 deletions
This file was deleted.

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

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ public final class Saml2MetadataFilter extends OncePerRequestFilter {
4646

4747
public static final String DEFAULT_METADATA_FILE_NAME = "saml-{registrationId}-metadata.xml";
4848

49-
private final RelyingPartyRegistrationResolver relyingPartyRegistrationResolver;
49+
private final Converter<HttpServletRequest, RelyingPartyRegistration> relyingPartyRegistrationConverter;
5050

5151
private final Saml2MetadataResolver saml2MetadataResolver;
5252

@@ -55,15 +55,11 @@ public final class Saml2MetadataFilter extends OncePerRequestFilter {
5555
private RequestMatcher requestMatcher = new AntPathRequestMatcher(
5656
"/saml2/service-provider-metadata/{registrationId}");
5757

58-
public Saml2MetadataFilter(Converter<HttpServletRequest, RelyingPartyRegistration> relyingPartyRegistrationResolver,
58+
public Saml2MetadataFilter(
59+
Converter<HttpServletRequest, RelyingPartyRegistration> relyingPartyRegistrationConverter,
5960
Saml2MetadataResolver saml2MetadataResolver) {
6061

61-
if (relyingPartyRegistrationResolver instanceof RelyingPartyRegistrationResolver) {
62-
this.relyingPartyRegistrationResolver = (RelyingPartyRegistrationResolver) relyingPartyRegistrationResolver;
63-
}
64-
else {
65-
this.relyingPartyRegistrationResolver = (request, id) -> relyingPartyRegistrationResolver.convert(request);
66-
}
62+
this.relyingPartyRegistrationConverter = relyingPartyRegistrationConverter;
6763
this.saml2MetadataResolver = saml2MetadataResolver;
6864
}
6965

@@ -75,15 +71,14 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse
7571
chain.doFilter(request, response);
7672
return;
7773
}
78-
String registrationId = matcher.getVariables().get("registrationId");
79-
RelyingPartyRegistration relyingPartyRegistration = this.relyingPartyRegistrationResolver.resolve(request,
80-
registrationId);
74+
RelyingPartyRegistration relyingPartyRegistration = this.relyingPartyRegistrationConverter.convert(request);
8175
if (relyingPartyRegistration == null) {
8276
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
8377
return;
8478
}
8579
String metadata = this.saml2MetadataResolver.resolve(relyingPartyRegistration);
86-
writeMetadataToResponse(response, relyingPartyRegistration.getRegistrationId(), metadata);
80+
String registrationId = relyingPartyRegistration.getRegistrationId();
81+
writeMetadataToResponse(response, registrationId, metadata);
8782
}
8883

8984
private void writeMetadataToResponse(HttpServletResponse response, String registrationId, String metadata)

saml2/saml2-service-provider/core/src/test/java/org/springframework/security/saml2/provider/service/servlet/filter/Saml2WebSsoAuthenticationFilterTests.java

Lines changed: 0 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -22,26 +22,14 @@
2222
import org.junit.Before;
2323
import org.junit.Test;
2424

25-
import org.springframework.mock.web.MockFilterChain;
2625
import org.springframework.mock.web.MockHttpServletRequest;
2726
import org.springframework.mock.web.MockHttpServletResponse;
28-
import org.springframework.security.authentication.AuthenticationManager;
29-
import org.springframework.security.authentication.TestingAuthenticationToken;
30-
import org.springframework.security.core.Authentication;
3127
import org.springframework.security.saml2.provider.service.authentication.Saml2AuthenticationException;
32-
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
3328
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
34-
import org.springframework.security.saml2.provider.service.registration.TestRelyingPartyRegistrations;
35-
import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver;
36-
import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver;
37-
import org.springframework.security.saml2.provider.service.web.Saml2AuthenticationTokenConverter;
38-
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
39-
import org.springframework.security.web.util.matcher.RequestMatcher;
4029

4130
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
4231
import static org.mockito.BDDMockito.given;
4332
import static org.mockito.Mockito.mock;
44-
import static org.mockito.Mockito.verify;
4533

4634
public class Saml2WebSsoAuthenticationFilterTests {
4735

@@ -53,8 +41,6 @@ public class Saml2WebSsoAuthenticationFilterTests {
5341

5442
private HttpServletResponse response = new MockHttpServletResponse();
5543

56-
private AuthenticationManager authenticationManager = mock(AuthenticationManager.class);
57-
5844
@Before
5945
public void setup() {
6046
this.filter = new Saml2WebSsoAuthenticationFilter(this.repository);
@@ -98,26 +84,4 @@ public void attemptAuthenticationWhenRegistrationIdDoesNotExistThenThrowsExcepti
9884
.withMessage("No relying party registration found");
9985
}
10086

101-
@Test
102-
public void doFilterWhenPathStartsWithRegistrationIdThenAuthenticates() throws Exception {
103-
RelyingPartyRegistration registration = TestRelyingPartyRegistrations.full().build();
104-
Authentication authentication = new TestingAuthenticationToken("user", "password");
105-
given(this.repository.findByRegistrationId("registration-id")).willReturn(registration);
106-
given(this.authenticationManager.authenticate(authentication)).willReturn(authentication);
107-
String loginProcessingUrl = "/{registrationId}/login/saml2/sso";
108-
RequestMatcher matcher = new AntPathRequestMatcher(loginProcessingUrl);
109-
DefaultRelyingPartyRegistrationResolver delegate = new DefaultRelyingPartyRegistrationResolver(this.repository);
110-
RelyingPartyRegistrationResolver resolver = (request, id) -> {
111-
String registrationId = matcher.matcher(request).getVariables().get("registrationId");
112-
return delegate.resolve(request, registrationId);
113-
};
114-
Saml2AuthenticationTokenConverter authenticationConverter = new Saml2AuthenticationTokenConverter(resolver);
115-
this.filter = new Saml2WebSsoAuthenticationFilter(authenticationConverter, loginProcessingUrl);
116-
this.filter.setAuthenticationManager(this.authenticationManager);
117-
this.request.setPathInfo("/registration-id/login/saml2/sso");
118-
this.request.setParameter("SAMLResponse", "response");
119-
this.filter.doFilter(this.request, this.response, new MockFilterChain());
120-
verify(this.repository).findByRegistrationId("registration-id");
121-
}
122-
12387
}

saml2/saml2-service-provider/core/src/test/java/org/springframework/security/saml2/provider/service/servlet/filter/Saml2WebSsoAuthenticationRequestFilterTests.java

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,7 @@
3636
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistration;
3737
import org.springframework.security.saml2.provider.service.registration.RelyingPartyRegistrationRepository;
3838
import org.springframework.security.saml2.provider.service.registration.Saml2MessageBinding;
39-
import org.springframework.security.saml2.provider.service.registration.TestRelyingPartyRegistrations;
40-
import org.springframework.security.saml2.provider.service.web.DefaultRelyingPartyRegistrationResolver;
41-
import org.springframework.security.saml2.provider.service.web.DefaultSaml2AuthenticationRequestContextResolver;
42-
import org.springframework.security.saml2.provider.service.web.RelyingPartyRegistrationResolver;
4339
import org.springframework.security.saml2.provider.service.web.Saml2AuthenticationRequestContextResolver;
44-
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
45-
import org.springframework.security.web.util.matcher.RequestMatcher;
4640
import org.springframework.web.util.HtmlUtils;
4741
import org.springframework.web.util.UriUtils;
4842

@@ -222,29 +216,4 @@ public void doFilterWhenRelyingPartyRegistrationNotFoundThenUnauthorized() throw
222216
assertThat(this.response.getStatus()).isEqualTo(401);
223217
}
224218

225-
@Test
226-
public void doFilterWhenPathStartsWithRegistrationIdThenPosts() throws Exception {
227-
RelyingPartyRegistration registration = TestRelyingPartyRegistrations.full()
228-
.assertingPartyDetails((party) -> party.singleSignOnServiceBinding(Saml2MessageBinding.POST)).build();
229-
RequestMatcher matcher = new AntPathRequestMatcher("/{registrationId}/saml2/authenticate");
230-
DefaultRelyingPartyRegistrationResolver delegate = new DefaultRelyingPartyRegistrationResolver(this.repository);
231-
RelyingPartyRegistrationResolver resolver = (request, id) -> {
232-
String registrationId = matcher.matcher(request).getVariables().get("registrationId");
233-
return delegate.resolve(request, registrationId);
234-
};
235-
Saml2AuthenticationRequestContextResolver authenticationRequestContextResolver = new DefaultSaml2AuthenticationRequestContextResolver(
236-
resolver);
237-
Saml2PostAuthenticationRequest authenticationRequest = mock(Saml2PostAuthenticationRequest.class);
238-
given(authenticationRequest.getAuthenticationRequestUri()).willReturn("uri");
239-
given(authenticationRequest.getRelayState()).willReturn("relay");
240-
given(authenticationRequest.getSamlRequest()).willReturn("saml");
241-
given(this.repository.findByRegistrationId("registration-id")).willReturn(registration);
242-
given(this.factory.createPostAuthenticationRequest(any())).willReturn(authenticationRequest);
243-
this.filter = new Saml2WebSsoAuthenticationRequestFilter(authenticationRequestContextResolver, this.factory);
244-
this.filter.setRedirectMatcher(matcher);
245-
this.request.setPathInfo("/registration-id/saml2/authenticate");
246-
this.filter.doFilter(this.request, this.response, new MockFilterChain());
247-
verify(this.repository).findByRegistrationId("registration-id");
248-
}
249-
250219
}

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

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@
2525
import org.junit.Test;
2626

2727
import org.springframework.http.HttpHeaders;
28-
import org.springframework.mock.web.MockFilterChain;
2928
import org.springframework.mock.web.MockHttpServletRequest;
3029
import org.springframework.mock.web.MockHttpServletResponse;
3130
import org.springframework.security.saml2.core.TestSaml2X509Credentials;
@@ -38,7 +37,6 @@
3837
import static org.assertj.core.api.Assertions.assertThat;
3938
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
4039
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
41-
import static org.mockito.ArgumentMatchers.any;
4240
import static org.mockito.BDDMockito.given;
4341
import static org.mockito.Mockito.mock;
4442
import static org.mockito.Mockito.verify;
@@ -138,20 +136,6 @@ public void doFilterWhenSetMetadataFilenameThenUses() throws Exception {
138136
.isEqualTo("attachment; filename=\"%s\"; filename*=UTF-8''%s", fileName, encodedFileName);
139137
}
140138

141-
@Test
142-
public void doFilterWhenPathStartsWithRegistrationIdThenServesMetadata() throws Exception {
143-
RelyingPartyRegistration registration = TestRelyingPartyRegistrations.full().build();
144-
given(this.repository.findByRegistrationId("registration-id")).willReturn(registration);
145-
given(this.resolver.resolve(any())).willReturn("metadata");
146-
DefaultRelyingPartyRegistrationResolver resolver = new DefaultRelyingPartyRegistrationResolver(
147-
(id) -> this.repository.findByRegistrationId("registration-id"));
148-
this.filter = new Saml2MetadataFilter(resolver, this.resolver);
149-
this.filter.setRequestMatcher(new AntPathRequestMatcher("/metadata"));
150-
this.request.setPathInfo("/metadata");
151-
this.filter.doFilter(this.request, this.response, new MockFilterChain());
152-
verify(this.repository).findByRegistrationId("registration-id");
153-
}
154-
155139
@Test
156140
public void setRequestMatcherWhenNullThenIllegalArgument() {
157141
assertThatIllegalArgumentException().isThrownBy(() -> this.filter.setRequestMatcher(null));

0 commit comments

Comments
 (0)