33 changed files with 583 additions and 150 deletions
@ -0,0 +1,133 @@ |
|||||||
|
/* |
||||||
|
* Copyright 2020-2024 the original author or authors. |
||||||
|
* |
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||||
|
* you may not use this file except in compliance with the License. |
||||||
|
* You may obtain a copy of the License at |
||||||
|
* |
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
* |
||||||
|
* Unless required by applicable law or agreed to in writing, software |
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||||
|
* See the License for the specific language governing permissions and |
||||||
|
* limitations under the License. |
||||||
|
*/ |
||||||
|
package org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers; |
||||||
|
|
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.concurrent.atomic.AtomicReference; |
||||||
|
|
||||||
|
import jakarta.servlet.FilterChain; |
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test; |
||||||
|
|
||||||
|
import org.springframework.mock.web.MockHttpServletRequest; |
||||||
|
import org.springframework.mock.web.MockHttpServletResponse; |
||||||
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder; |
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings; |
||||||
|
|
||||||
|
import static org.assertj.core.api.Assertions.assertThat; |
||||||
|
|
||||||
|
/** |
||||||
|
* Tests for {@link AuthorizationServerContextFilter}. |
||||||
|
* |
||||||
|
* @author Joe Grandja |
||||||
|
*/ |
||||||
|
class AuthorizationServerContextFilterTests { |
||||||
|
private static final String SCHEME = "https"; |
||||||
|
private static final String HOST = "example.com"; |
||||||
|
private static final int PORT = 8443; |
||||||
|
private static final String DEFAULT_ISSUER = SCHEME + "://" + HOST + ":" + PORT; |
||||||
|
private AuthorizationServerContextFilter filter; |
||||||
|
|
||||||
|
@Test |
||||||
|
public void doFilterWhenDefaultEndpointsThenIssuerResolved() throws Exception { |
||||||
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().build(); |
||||||
|
this.filter = new AuthorizationServerContextFilter(authorizationServerSettings); |
||||||
|
|
||||||
|
String issuerPath = "/issuer1"; |
||||||
|
String issuerWithPath = DEFAULT_ISSUER.concat(issuerPath); |
||||||
|
Set<String> endpointUris = getEndpointUris(authorizationServerSettings); |
||||||
|
|
||||||
|
for (String endpointUri : endpointUris) { |
||||||
|
assertResolvedIssuer(issuerPath.concat(endpointUri), issuerWithPath); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void doFilterWhenCustomEndpointsThenIssuerResolved() throws Exception { |
||||||
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder() |
||||||
|
.authorizationEndpoint("/oauth2/v1/authorize") |
||||||
|
.deviceAuthorizationEndpoint("/oauth2/v1/device_authorization") |
||||||
|
.deviceVerificationEndpoint("/oauth2/v1/device_verification") |
||||||
|
.tokenEndpoint("/oauth2/v1/token") |
||||||
|
.jwkSetEndpoint("/oauth2/v1/jwks") |
||||||
|
.tokenRevocationEndpoint("/oauth2/v1/revoke") |
||||||
|
.tokenIntrospectionEndpoint("/oauth2/v1/introspect") |
||||||
|
.oidcClientRegistrationEndpoint("/connect/v1/register") |
||||||
|
.oidcUserInfoEndpoint("/v1/userinfo") |
||||||
|
.oidcLogoutEndpoint("/connect/v1/logout") |
||||||
|
.build(); |
||||||
|
this.filter = new AuthorizationServerContextFilter(authorizationServerSettings); |
||||||
|
|
||||||
|
String issuerPath = "/issuer2"; |
||||||
|
String issuerWithPath = DEFAULT_ISSUER.concat(issuerPath); |
||||||
|
Set<String> endpointUris = getEndpointUris(authorizationServerSettings); |
||||||
|
|
||||||
|
for (String endpointUri : endpointUris) { |
||||||
|
assertResolvedIssuer(issuerPath.concat(endpointUri), issuerWithPath); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
@Test |
||||||
|
public void doFilterWhenIssuerHasMultiplePathsThenIssuerResolved() throws Exception { |
||||||
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().build(); |
||||||
|
this.filter = new AuthorizationServerContextFilter(authorizationServerSettings); |
||||||
|
|
||||||
|
String issuerPath = "/path1/path2/issuer3"; |
||||||
|
String issuerWithPath = DEFAULT_ISSUER.concat(issuerPath); |
||||||
|
Set<String> endpointUris = getEndpointUris(authorizationServerSettings); |
||||||
|
|
||||||
|
for (String endpointUri : endpointUris) { |
||||||
|
assertResolvedIssuer(issuerPath.concat(endpointUri), issuerWithPath); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
private void assertResolvedIssuer(String requestUri, String expectedIssuer) throws Exception { |
||||||
|
MockHttpServletRequest request = createRequest(requestUri); |
||||||
|
MockHttpServletResponse response = new MockHttpServletResponse(); |
||||||
|
|
||||||
|
AtomicReference<String> resolvedIssuer = new AtomicReference<>(); |
||||||
|
FilterChain filterChain = (req, resp) -> |
||||||
|
resolvedIssuer.set(AuthorizationServerContextHolder.getContext().getIssuer()); |
||||||
|
|
||||||
|
this.filter.doFilter(request, response, filterChain); |
||||||
|
|
||||||
|
assertThat(resolvedIssuer.get()).isEqualTo(expectedIssuer); |
||||||
|
} |
||||||
|
|
||||||
|
private static Set<String> getEndpointUris(AuthorizationServerSettings authorizationServerSettings) { |
||||||
|
Set<String> endpointUris = new HashSet<>(); |
||||||
|
endpointUris.add("/.well-known/oauth-authorization-server"); |
||||||
|
endpointUris.add("/.well-known/openid-configuration"); |
||||||
|
for (Map.Entry<String, Object> setting : authorizationServerSettings.getSettings().entrySet()) { |
||||||
|
if (setting.getKey().endsWith("-endpoint")) { |
||||||
|
endpointUris.add((String) setting.getValue()); |
||||||
|
} |
||||||
|
} |
||||||
|
return endpointUris; |
||||||
|
} |
||||||
|
|
||||||
|
private static MockHttpServletRequest createRequest(String requestUri) { |
||||||
|
MockHttpServletRequest request = new MockHttpServletRequest(); |
||||||
|
request.setRequestURI(requestUri); |
||||||
|
request.setScheme(SCHEME); |
||||||
|
request.setServerName(HOST); |
||||||
|
request.setServerPort(PORT); |
||||||
|
return request; |
||||||
|
} |
||||||
|
|
||||||
|
} |
||||||
Loading…
Reference in new issue