10 changed files with 91 additions and 301 deletions
@ -1,58 +0,0 @@
@@ -1,58 +0,0 @@
|
||||
/* |
||||
* Copyright 2020-2021 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.authentication; |
||||
|
||||
import org.springframework.lang.Nullable; |
||||
import org.springframework.security.core.Authentication; |
||||
import org.springframework.security.oauth2.core.OAuth2AuthenticationException; |
||||
import org.springframework.security.oauth2.core.OAuth2Error; |
||||
|
||||
/** |
||||
* This exception is thrown by {@link OAuth2ClientCredentialsAuthenticationProvider} |
||||
* when an attempt to authenticate the OAuth 2.0 Authorization Request (or Consent) fails. |
||||
* |
||||
* @author Adam Pilling |
||||
* @since 1.3.0 |
||||
* @see OAuth2ClientCredentialsAuthenticationToken |
||||
* @see OAuth2ClientCredentialsAuthenticationProvider |
||||
*/ |
||||
public class OAuth2ClientCredentialsAuthenticationException extends OAuth2AuthenticationException { |
||||
private final OAuth2ClientCredentialsAuthenticationToken authorizationCodeRequestAuthentication; |
||||
|
||||
/** |
||||
* Constructs an {@code OAuth2ClientCredentialsAuthenticationException} using the provided parameters. |
||||
* |
||||
* @param error the {@link OAuth2Error OAuth 2.0 Error} |
||||
* @param authorizationCodeRequestAuthentication the {@link Authentication} instance of the OAuth 2.0 Authorization Request (or Consent) |
||||
*/ |
||||
public OAuth2ClientCredentialsAuthenticationException( |
||||
OAuth2Error error, |
||||
@Nullable OAuth2ClientCredentialsAuthenticationToken authorizationCodeRequestAuthentication) { |
||||
super(error); |
||||
this.authorizationCodeRequestAuthentication = authorizationCodeRequestAuthentication; |
||||
} |
||||
|
||||
/** |
||||
* Returns the {@link Authentication} instance of the OAuth 2.0 Authorization Request (or Consent), or {@code null} if not available. |
||||
* |
||||
* @return the {@link OAuth2AuthorizationCodeRequestAuthenticationToken} |
||||
*/ |
||||
@Nullable |
||||
public OAuth2ClientCredentialsAuthenticationToken getClientCredentialsAuthentication() { |
||||
return this.authorizationCodeRequestAuthentication; |
||||
} |
||||
|
||||
} |
||||
@ -1,88 +0,0 @@
@@ -1,88 +0,0 @@
|
||||
/* |
||||
* Copyright 2020-2022 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.authentication; |
||||
|
||||
import java.security.Principal; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
|
||||
import org.junit.jupiter.api.Test; |
||||
|
||||
import org.springframework.security.core.Authentication; |
||||
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; |
||||
import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations; |
||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; |
||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy; |
||||
|
||||
/** |
||||
* Tests for {@link OAuth2ClientCredentialsAuthenticationContext}. |
||||
* |
||||
* @author Steve Riesenberg |
||||
* @author Joe Grandja |
||||
*/ |
||||
public class OAuth2ClientCredentialsAuthenticationContextTests { |
||||
private final RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build(); |
||||
private final OAuth2Authorization authorization = TestOAuth2Authorizations.authorization(this.registeredClient).build(); |
||||
private final Authentication principal = this.authorization.getAttribute(Principal.class.getName()); |
||||
private final OAuth2ClientCredentialsAuthenticationToken authorizationConsentAuthentication = |
||||
new OAuth2ClientCredentialsAuthenticationToken(this.principal, Set.of("a_scope"), Map.of("a_key", "a_value")); |
||||
|
||||
@Test |
||||
public void withWhenAuthenticationNullThenThrowIllegalArgumentException() { |
||||
assertThatThrownBy(() -> OAuth2ClientCredentialsAuthenticationContext.with(null)) |
||||
.isInstanceOf(IllegalArgumentException.class) |
||||
.hasMessage("authentication cannot be null"); |
||||
} |
||||
|
||||
@Test |
||||
public void setWhenValueNullThenThrowIllegalArgumentException() { |
||||
OAuth2ClientCredentialsAuthenticationContext.Builder builder = |
||||
OAuth2ClientCredentialsAuthenticationContext.with(this.authorizationConsentAuthentication); |
||||
|
||||
assertThatThrownBy(() -> builder.registeredClient(null)) |
||||
.isInstanceOf(IllegalArgumentException.class); |
||||
assertThatThrownBy(() -> builder.put(null, "")) |
||||
.isInstanceOf(IllegalArgumentException.class); |
||||
} |
||||
|
||||
@Test |
||||
public void buildWhenRequiredValueNullThenThrowIllegalArgumentException() { |
||||
OAuth2ClientCredentialsAuthenticationContext.Builder builder = |
||||
OAuth2ClientCredentialsAuthenticationContext.with(this.authorizationConsentAuthentication); |
||||
assertThatThrownBy(builder::build) |
||||
.isInstanceOf(IllegalArgumentException.class) |
||||
.hasMessage("registeredClient cannot be null"); |
||||
} |
||||
|
||||
@Test |
||||
public void buildWhenAllValuesProvidedThenAllValuesAreSet() { |
||||
OAuth2ClientCredentialsAuthenticationContext context = |
||||
OAuth2ClientCredentialsAuthenticationContext.with(this.authorizationConsentAuthentication) |
||||
.registeredClient(this.registeredClient) |
||||
.put("custom-key-1", "custom-value-1") |
||||
.context(ctx -> ctx.put("custom-key-2", "custom-value-2")) |
||||
.build(); |
||||
|
||||
assertThat(context.<Authentication>getAuthentication()).isEqualTo(this.authorizationConsentAuthentication); |
||||
assertThat(context.getRegisteredClient()).isEqualTo(this.registeredClient); |
||||
assertThat(context.<String>get("custom-key-1")).isEqualTo("custom-value-1"); |
||||
assertThat(context.<String>get("custom-key-2")).isEqualTo("custom-value-2"); |
||||
} |
||||
|
||||
} |
||||
@ -1,70 +0,0 @@
@@ -1,70 +0,0 @@
|
||||
/* |
||||
* Copyright 2020-2022 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.authentication; |
||||
|
||||
import org.junit.Test; |
||||
import org.junit.jupiter.params.ParameterizedTest; |
||||
import org.junit.jupiter.params.provider.Arguments; |
||||
import org.junit.jupiter.params.provider.MethodSource; |
||||
import org.springframework.security.core.Authentication; |
||||
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization; |
||||
import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations; |
||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient; |
||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients; |
||||
|
||||
import java.security.Principal; |
||||
import java.util.HashSet; |
||||
import java.util.Map; |
||||
import java.util.Set; |
||||
import java.util.stream.Stream; |
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat; |
||||
import static org.assertj.core.api.Assertions.assertThatNoException; |
||||
import static org.assertj.core.api.Assertions.assertThatThrownBy; |
||||
import static org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients.SCOPE_1; |
||||
import static org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients.SCOPE_2; |
||||
|
||||
public class OAuth2ClientCredentialsAuthenticationValidatorTest { |
||||
private final RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build(); |
||||
private final OAuth2Authorization authorization = TestOAuth2Authorizations.authorization(this.registeredClient).build(); |
||||
private final Authentication principal = this.authorization.getAttribute(Principal.class.getName()); |
||||
private final OAuth2ClientCredentialsAuthenticationValidator validator = new OAuth2ClientCredentialsAuthenticationValidator(); |
||||
|
||||
@ParameterizedTest |
||||
@MethodSource("validScopes") |
||||
public void acceptWhenRequestScopesAreEmptyOrValidThenDoesNotThrowException(Set<String> testScopes) { |
||||
OAuth2ClientCredentialsAuthenticationToken token = |
||||
new OAuth2ClientCredentialsAuthenticationToken(this.principal, testScopes, Map.of()); |
||||
OAuth2ClientCredentialsAuthenticationContext context = OAuth2ClientCredentialsAuthenticationContext.with(token).registeredClient(registeredClient).build(); |
||||
|
||||
assertThatNoException().isThrownBy(() -> validator.accept(context)); |
||||
} |
||||
|
||||
@Test |
||||
public void acceptWhenRequestScopesAreNotAllValidThenThrowException() { |
||||
OAuth2ClientCredentialsAuthenticationToken token = |
||||
new OAuth2ClientCredentialsAuthenticationToken(this.principal, Set.of(SCOPE_1, SCOPE_2), Map.of()); |
||||
OAuth2ClientCredentialsAuthenticationContext context = OAuth2ClientCredentialsAuthenticationContext.with(token).registeredClient(registeredClient).build(); |
||||
|
||||
assertThatThrownBy(() -> validator.accept(context)) |
||||
.isInstanceOfSatisfying(OAuth2ClientCredentialsAuthenticationException.class, |
||||
t -> assertThat(t.getClientCredentialsAuthentication()).isEqualTo(token)); |
||||
} |
||||
|
||||
static Stream<Arguments> validScopes() { |
||||
return Stream.of(Arguments.of(new HashSet<>()), Arguments.of(Set.of(SCOPE_1))); |
||||
} |
||||
} |
||||
Loading…
Reference in new issue