Merge branch 0.4.x into main
The following commits are merged using the default merge strategy.2dabfa02e0Remove constructor in OidcProviderConfigurationEndpointFilter6b66719a83Remove constructor in OAuth2AuthorizationServerMetadataEndpointFilteraebc613862Make AuthorizationServerContext an interfacef583668a9cMake AuthorizationServerContextFilter private3efee494adRename ProviderContextc60ae4532fRename ProviderSettings
This commit is contained in:
@@ -91,7 +91,7 @@ public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity h
|
|||||||
.registeredClientRepository(registeredClientRepository) <1>
|
.registeredClientRepository(registeredClientRepository) <1>
|
||||||
.authorizationService(authorizationService) <2>
|
.authorizationService(authorizationService) <2>
|
||||||
.authorizationConsentService(authorizationConsentService) <3>
|
.authorizationConsentService(authorizationConsentService) <3>
|
||||||
.providerSettings(providerSettings) <4>
|
.authorizationServerSettings(authorizationServerSettings) <4>
|
||||||
.tokenGenerator(tokenGenerator) <5>
|
.tokenGenerator(tokenGenerator) <5>
|
||||||
.clientAuthentication(clientAuthentication -> { }) <6>
|
.clientAuthentication(clientAuthentication -> { }) <6>
|
||||||
.authorizationEndpoint(authorizationEndpoint -> { }) <7>
|
.authorizationEndpoint(authorizationEndpoint -> { }) <7>
|
||||||
@@ -109,7 +109,7 @@ public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity h
|
|||||||
<1> `registeredClientRepository()`: The xref:core-model-components.adoc#registered-client-repository[`RegisteredClientRepository`] (*REQUIRED*) for managing new and existing clients.
|
<1> `registeredClientRepository()`: The xref:core-model-components.adoc#registered-client-repository[`RegisteredClientRepository`] (*REQUIRED*) for managing new and existing clients.
|
||||||
<2> `authorizationService()`: The xref:core-model-components.adoc#oauth2-authorization-service[`OAuth2AuthorizationService`] for managing new and existing authorizations.
|
<2> `authorizationService()`: The xref:core-model-components.adoc#oauth2-authorization-service[`OAuth2AuthorizationService`] for managing new and existing authorizations.
|
||||||
<3> `authorizationConsentService()`: The xref:core-model-components.adoc#oauth2-authorization-consent-service[`OAuth2AuthorizationConsentService`] for managing new and existing authorization consents.
|
<3> `authorizationConsentService()`: The xref:core-model-components.adoc#oauth2-authorization-consent-service[`OAuth2AuthorizationConsentService`] for managing new and existing authorization consents.
|
||||||
<4> `providerSettings()`: The <<configuring-provider-settings, `ProviderSettings`>> (*REQUIRED*) for customizing configuration settings for the OAuth2 authorization server.
|
<4> `authorizationServerSettings()`: The <<configuring-authorization-server-settings, `AuthorizationServerSettings`>> (*REQUIRED*) for customizing configuration settings for the OAuth2 authorization server.
|
||||||
<5> `tokenGenerator()`: The xref:core-model-components.adoc#oauth2-token-generator[`OAuth2TokenGenerator`] for generating tokens supported by the OAuth2 authorization server.
|
<5> `tokenGenerator()`: The xref:core-model-components.adoc#oauth2-token-generator[`OAuth2TokenGenerator`] for generating tokens supported by the OAuth2 authorization server.
|
||||||
<6> `clientAuthentication()`: The configurer for <<configuring-client-authentication, OAuth2 Client Authentication>>.
|
<6> `clientAuthentication()`: The configurer for <<configuring-client-authentication, OAuth2 Client Authentication>>.
|
||||||
<7> `authorizationEndpoint()`: The configurer for the xref:protocol-endpoints.adoc#oauth2-authorization-endpoint[OAuth2 Authorization endpoint].
|
<7> `authorizationEndpoint()`: The configurer for the xref:protocol-endpoints.adoc#oauth2-authorization-endpoint[OAuth2 Authorization endpoint].
|
||||||
@@ -119,16 +119,16 @@ public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity h
|
|||||||
<11> `userInfoEndpoint()`: The configurer for the xref:protocol-endpoints.adoc#oidc-user-info-endpoint[OpenID Connect 1.0 UserInfo endpoint].
|
<11> `userInfoEndpoint()`: The configurer for the xref:protocol-endpoints.adoc#oidc-user-info-endpoint[OpenID Connect 1.0 UserInfo endpoint].
|
||||||
<12> `clientRegistrationEndpoint()`: The configurer for the xref:protocol-endpoints.adoc#oidc-client-registration-endpoint[OpenID Connect 1.0 Client Registration endpoint].
|
<12> `clientRegistrationEndpoint()`: The configurer for the xref:protocol-endpoints.adoc#oidc-client-registration-endpoint[OpenID Connect 1.0 Client Registration endpoint].
|
||||||
|
|
||||||
[[configuring-provider-settings]]
|
[[configuring-authorization-server-settings]]
|
||||||
== Configuring Provider Settings
|
== Configuring Authorization Server Settings
|
||||||
|
|
||||||
`ProviderSettings` contains the configuration settings for the OAuth2 authorization server (provider).
|
`AuthorizationServerSettings` contains the configuration settings for the OAuth2 authorization server.
|
||||||
It specifies the `URI` for the protocol endpoints as well as the https://datatracker.ietf.org/doc/html/rfc8414#section-2[issuer identifier].
|
It specifies the `URI` for the protocol endpoints as well as the https://datatracker.ietf.org/doc/html/rfc8414#section-2[issuer identifier].
|
||||||
The default `URI` for the protocol endpoints are as follows:
|
The default `URI` for the protocol endpoints are as follows:
|
||||||
|
|
||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
public final class ProviderSettings extends AbstractSettings {
|
public final class AuthorizationServerSettings extends AbstractSettings {
|
||||||
|
|
||||||
...
|
...
|
||||||
|
|
||||||
@@ -149,18 +149,18 @@ public final class ProviderSettings extends AbstractSettings {
|
|||||||
----
|
----
|
||||||
|
|
||||||
[NOTE]
|
[NOTE]
|
||||||
`ProviderSettings` is a *REQUIRED* component.
|
`AuthorizationServerSettings` is a *REQUIRED* component.
|
||||||
|
|
||||||
[TIP]
|
[TIP]
|
||||||
<<default-configuration, `@Import(OAuth2AuthorizationServerConfiguration.class)`>> automatically registers a `ProviderSettings` `@Bean`, if not already provided.
|
<<default-configuration, `@Import(OAuth2AuthorizationServerConfiguration.class)`>> automatically registers an `AuthorizationServerSettings` `@Bean`, if not already provided.
|
||||||
|
|
||||||
The following example shows how to customize the configuration settings and register a `ProviderSettings` `@Bean`:
|
The following example shows how to customize the configuration settings and register an `AuthorizationServerSettings` `@Bean`:
|
||||||
|
|
||||||
[source,java]
|
[source,java]
|
||||||
----
|
----
|
||||||
@Bean
|
@Bean
|
||||||
public ProviderSettings providerSettings() {
|
public AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder()
|
return AuthorizationServerSettings.builder()
|
||||||
.issuer("https://example.com")
|
.issuer("https://example.com")
|
||||||
.authorizationEndpoint("/oauth2/v1/authorize")
|
.authorizationEndpoint("/oauth2/v1/authorize")
|
||||||
.tokenEndpoint("/oauth2/v1/token")
|
.tokenEndpoint("/oauth2/v1/token")
|
||||||
@@ -173,17 +173,14 @@ public ProviderSettings providerSettings() {
|
|||||||
}
|
}
|
||||||
----
|
----
|
||||||
|
|
||||||
The `ProviderContext` is a context object that holds information about the provider.
|
The `AuthorizationServerContext` is a context object that holds information of the Authorization Server runtime environment.
|
||||||
It provides access to the `ProviderSettings` and the "`current`" issuer identifier.
|
It provides access to the `AuthorizationServerSettings` and the "`current`" issuer identifier.
|
||||||
|
|
||||||
[NOTE]
|
[NOTE]
|
||||||
If the issuer identifier is not configured in `ProviderSettings.builder().issuer(String)`, it is resolved from the current request.
|
If the issuer identifier is not configured in `AuthorizationServerSettings.builder().issuer(String)`, it is resolved from the current request.
|
||||||
|
|
||||||
[NOTE]
|
[NOTE]
|
||||||
The `ProviderContext` is accessible through the `ProviderContextHolder`, which associates it with the current request thread by using a `ThreadLocal`.
|
The `AuthorizationServerContext` is accessible through the `AuthorizationServerContextHolder`, which associates it with the current request thread by using a `ThreadLocal`.
|
||||||
|
|
||||||
[NOTE]
|
|
||||||
The `ProviderContextFilter` associates the `ProviderContext` with the `ProviderContextHolder`.
|
|
||||||
|
|
||||||
[[configuring-client-authentication]]
|
[[configuring-client-authentication]]
|
||||||
== Configuring Client Authentication
|
== Configuring Client Authentication
|
||||||
|
|||||||
@@ -316,7 +316,7 @@ public interface OAuth2TokenContext extends Context {
|
|||||||
|
|
||||||
default <T extends Authentication> T getPrincipal() ... <2>
|
default <T extends Authentication> T getPrincipal() ... <2>
|
||||||
|
|
||||||
default ProviderContext getProviderContext() ... <3>
|
default AuthorizationServerContext getAuthorizationServerContext() ... <3>
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
default OAuth2Authorization getAuthorization() ... <4>
|
default OAuth2Authorization getAuthorization() ... <4>
|
||||||
@@ -335,7 +335,7 @@ public interface OAuth2TokenContext extends Context {
|
|||||||
----
|
----
|
||||||
<1> `getRegisteredClient()`: The <<registered-client, RegisteredClient>> associated with the authorization grant.
|
<1> `getRegisteredClient()`: The <<registered-client, RegisteredClient>> associated with the authorization grant.
|
||||||
<2> `getPrincipal()`: The `Authentication` instance of the resource owner (or client).
|
<2> `getPrincipal()`: The `Authentication` instance of the resource owner (or client).
|
||||||
<3> `getProviderContext()`: The xref:configuration-model.adoc#configuring-provider-settings[`ProviderContext`] object that holds information related to the provider.
|
<3> `getAuthorizationServerContext()`: The xref:configuration-model.adoc#configuring-authorization-server-settings[`AuthorizationServerContext`] object that holds information of the Authorization Server runtime environment.
|
||||||
<4> `getAuthorization()`: The <<oauth2-authorization, OAuth2Authorization>> associated with the authorization grant.
|
<4> `getAuthorization()`: The <<oauth2-authorization, OAuth2Authorization>> associated with the authorization grant.
|
||||||
<5> `getAuthorizedScopes()`: The scope(s) authorized for the client.
|
<5> `getAuthorizedScopes()`: The scope(s) authorized for the client.
|
||||||
<6> `getTokenType()`: The `OAuth2TokenType` to generate. The supported values are `code`, `access_token`, `refresh_token`, and `id_token`.
|
<6> `getTokenType()`: The `OAuth2TokenType` to generate. The supported values are `code`, `access_token`, `refresh_token`, and `id_token`.
|
||||||
|
|||||||
@@ -42,8 +42,8 @@ import org.springframework.security.oauth2.server.authorization.client.InMemoryR
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
||||||
@@ -150,8 +150,8 @@ public class SecurityConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean // <7>
|
@Bean // <7>
|
||||||
public ProviderSettings providerSettings() {
|
public AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().build();
|
return AuthorizationServerSettings.builder().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,8 +44,8 @@ import org.springframework.security.oauth2.server.authorization.client.InMemoryR
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
||||||
@@ -158,8 +158,8 @@ public class EnableUserInfoSecurityConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ProviderSettings providerSettings() {
|
public AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().build();
|
return AuthorizationServerSettings.builder().build();
|
||||||
}
|
}
|
||||||
// @fold:off
|
// @fold:off
|
||||||
|
|
||||||
|
|||||||
@@ -49,8 +49,8 @@ import org.springframework.security.oauth2.server.authorization.config.annotatio
|
|||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationContext;
|
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
||||||
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
@@ -182,8 +182,8 @@ public class JwtUserInfoMapperSecurityConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ProviderSettings providerSettings() {
|
public AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().build();
|
return AuthorizationServerSettings.builder().build();
|
||||||
}
|
}
|
||||||
// @fold:off
|
// @fold:off
|
||||||
|
|
||||||
|
|||||||
@@ -55,4 +55,4 @@ This is a minimal configuration for getting started quickly. To understand what
|
|||||||
<4> An instance of xref:core-model-components.adoc#registered-client-repository[`RegisteredClientRepository`] for managing clients.
|
<4> An instance of xref:core-model-components.adoc#registered-client-repository[`RegisteredClientRepository`] for managing clients.
|
||||||
<5> An instance of `com.nimbusds.jose.jwk.source.JWKSource` for signing access tokens.
|
<5> An instance of `com.nimbusds.jose.jwk.source.JWKSource` for signing access tokens.
|
||||||
<6> An instance of `java.security.KeyPair` with keys generated on startup used to create the `JWKSource` above.
|
<6> An instance of `java.security.KeyPair` with keys generated on startup used to create the `JWKSource` above.
|
||||||
<7> An instance of xref:configuration-model#configuring-provider-settings[`ProviderSettings`] to configure Spring Authorization Server.
|
<7> An instance of xref:configuration-model#configuring-authorization-server-settings[`AuthorizationServerSettings`] to configure Spring Authorization Server.
|
||||||
|
|||||||
@@ -51,9 +51,9 @@ import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
import org.springframework.util.CollectionUtils;
|
import org.springframework.util.CollectionUtils;
|
||||||
import org.springframework.util.StringUtils;
|
import org.springframework.util.StringUtils;
|
||||||
@@ -221,20 +221,20 @@ public final class JwtClientAssertionAuthenticationProvider implements Authentic
|
|||||||
return new DelegatingOAuth2TokenValidator<>(
|
return new DelegatingOAuth2TokenValidator<>(
|
||||||
new JwtClaimValidator<>(JwtClaimNames.ISS, clientId::equals),
|
new JwtClaimValidator<>(JwtClaimNames.ISS, clientId::equals),
|
||||||
new JwtClaimValidator<>(JwtClaimNames.SUB, clientId::equals),
|
new JwtClaimValidator<>(JwtClaimNames.SUB, clientId::equals),
|
||||||
new JwtClaimValidator<>(JwtClaimNames.AUD, containsProviderAudience()),
|
new JwtClaimValidator<>(JwtClaimNames.AUD, containsAudience()),
|
||||||
new JwtClaimValidator<>(JwtClaimNames.EXP, Objects::nonNull),
|
new JwtClaimValidator<>(JwtClaimNames.EXP, Objects::nonNull),
|
||||||
new JwtTimestampValidator()
|
new JwtTimestampValidator()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Predicate<List<String>> containsProviderAudience() {
|
private static Predicate<List<String>> containsAudience() {
|
||||||
return (audienceClaim) -> {
|
return (audienceClaim) -> {
|
||||||
if (CollectionUtils.isEmpty(audienceClaim)) {
|
if (CollectionUtils.isEmpty(audienceClaim)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
List<String> providerAudience = getProviderAudience();
|
List<String> audienceList = getAudience();
|
||||||
for (String audience : audienceClaim) {
|
for (String audience : audienceClaim) {
|
||||||
if (providerAudience.contains(audience)) {
|
if (audienceList.contains(audience)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -242,19 +242,19 @@ public final class JwtClientAssertionAuthenticationProvider implements Authentic
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<String> getProviderAudience() {
|
private static List<String> getAudience() {
|
||||||
ProviderContext providerContext = ProviderContextHolder.getProviderContext();
|
AuthorizationServerContext authorizationServerContext = AuthorizationServerContextHolder.getContext();
|
||||||
if (!StringUtils.hasText(providerContext.getIssuer())) {
|
if (!StringUtils.hasText(authorizationServerContext.getIssuer())) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
ProviderSettings providerSettings = providerContext.getProviderSettings();
|
AuthorizationServerSettings authorizationServerSettings = authorizationServerContext.getAuthorizationServerSettings();
|
||||||
List<String> providerAudience = new ArrayList<>();
|
List<String> audience = new ArrayList<>();
|
||||||
providerAudience.add(providerContext.getIssuer());
|
audience.add(authorizationServerContext.getIssuer());
|
||||||
providerAudience.add(asUrl(providerContext.getIssuer(), providerSettings.getTokenEndpoint()));
|
audience.add(asUrl(authorizationServerContext.getIssuer(), authorizationServerSettings.getTokenEndpoint()));
|
||||||
providerAudience.add(asUrl(providerContext.getIssuer(), providerSettings.getTokenIntrospectionEndpoint()));
|
audience.add(asUrl(authorizationServerContext.getIssuer(), authorizationServerSettings.getTokenIntrospectionEndpoint()));
|
||||||
providerAudience.add(asUrl(providerContext.getIssuer(), providerSettings.getTokenRevocationEndpoint()));
|
audience.add(asUrl(authorizationServerContext.getIssuer(), authorizationServerSettings.getTokenRevocationEndpoint()));
|
||||||
return providerAudience;
|
return audience;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String asUrl(String issuer, String endpoint) {
|
private static String asUrl(String issuer, String endpoint) {
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ import org.springframework.security.oauth2.server.authorization.OAuth2Authorizat
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
@@ -132,7 +132,7 @@ public final class OAuth2AuthorizationCodeAuthenticationProvider implements Auth
|
|||||||
DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder()
|
DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(authorization.getAttribute(Principal.class.getName()))
|
.principal(authorization.getAttribute(Principal.class.getName()))
|
||||||
.providerContext(ProviderContextHolder.getProviderContext())
|
.authorizationServerContext(AuthorizationServerContextHolder.getContext())
|
||||||
.authorization(authorization)
|
.authorization(authorization)
|
||||||
.authorizedScopes(authorization.getAuthorizedScopes())
|
.authorizedScopes(authorization.getAuthorizedScopes())
|
||||||
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ import org.springframework.security.oauth2.server.authorization.OAuth2Authorizat
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
@@ -438,7 +438,7 @@ public final class OAuth2AuthorizationCodeRequestAuthenticationProvider implemen
|
|||||||
DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder()
|
DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal((Authentication) authorizationCodeRequestAuthentication.getPrincipal())
|
.principal((Authentication) authorizationCodeRequestAuthentication.getPrincipal())
|
||||||
.providerContext(ProviderContextHolder.getProviderContext())
|
.authorizationServerContext(AuthorizationServerContextHolder.getContext())
|
||||||
.tokenType(new OAuth2TokenType(OAuth2ParameterNames.CODE))
|
.tokenType(new OAuth2TokenType(OAuth2ParameterNames.CODE))
|
||||||
.authorizedScopes(authorizedScopes)
|
.authorizedScopes(authorizedScopes)
|
||||||
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ import org.springframework.security.oauth2.server.authorization.OAuth2Authorizat
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
@@ -102,7 +102,7 @@ public final class OAuth2ClientCredentialsAuthenticationProvider implements Auth
|
|||||||
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(clientPrincipal)
|
.principal(clientPrincipal)
|
||||||
.providerContext(ProviderContextHolder.getProviderContext())
|
.authorizationServerContext(AuthorizationServerContextHolder.getContext())
|
||||||
.authorizedScopes(authorizedScopes)
|
.authorizedScopes(authorizedScopes)
|
||||||
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
||||||
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
|
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
|
||||||
|
|||||||
@@ -40,7 +40,7 @@ import org.springframework.security.oauth2.server.authorization.OAuth2Authorizat
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.DefaultOAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
@@ -130,7 +130,7 @@ public final class OAuth2RefreshTokenAuthenticationProvider implements Authentic
|
|||||||
DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder()
|
DefaultOAuth2TokenContext.Builder tokenContextBuilder = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(authorization.getAttribute(Principal.class.getName()))
|
.principal(authorization.getAttribute(Principal.class.getName()))
|
||||||
.providerContext(ProviderContextHolder.getProviderContext())
|
.authorizationServerContext(AuthorizationServerContextHolder.getContext())
|
||||||
.authorization(authorization)
|
.authorization(authorization)
|
||||||
.authorizedScopes(scopes)
|
.authorizedScopes(scopes)
|
||||||
.authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
|
.authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
|||||||
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
||||||
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
|
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
import org.springframework.security.web.util.matcher.RequestMatcher;
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ public class OAuth2AuthorizationServerConfiguration {
|
|||||||
@Bean
|
@Bean
|
||||||
RegisterMissingBeanPostProcessor registerMissingBeanPostProcessor() {
|
RegisterMissingBeanPostProcessor registerMissingBeanPostProcessor() {
|
||||||
RegisterMissingBeanPostProcessor postProcessor = new RegisterMissingBeanPostProcessor();
|
RegisterMissingBeanPostProcessor postProcessor = new RegisterMissingBeanPostProcessor();
|
||||||
postProcessor.addBeanDefinition(ProviderSettings.class, () -> ProviderSettings.builder().build());
|
postProcessor.addBeanDefinition(AuthorizationServerSettings.class, () -> AuthorizationServerSettings.builder().build());
|
||||||
return postProcessor;
|
return postProcessor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,105 @@
|
|||||||
|
/*
|
||||||
|
* 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.config.annotation.web.configurers;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import jakarta.servlet.FilterChain;
|
||||||
|
import jakarta.servlet.ServletException;
|
||||||
|
import jakarta.servlet.http.HttpServletRequest;
|
||||||
|
import jakarta.servlet.http.HttpServletResponse;
|
||||||
|
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
|
import org.springframework.security.web.util.UrlUtils;
|
||||||
|
import org.springframework.util.Assert;
|
||||||
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@code Filter} that associates the {@link AuthorizationServerContext} to the {@link AuthorizationServerContextHolder}.
|
||||||
|
*
|
||||||
|
* @author Joe Grandja
|
||||||
|
* @since 0.2.2
|
||||||
|
* @see AuthorizationServerContext
|
||||||
|
* @see AuthorizationServerContextHolder
|
||||||
|
* @see AuthorizationServerSettings
|
||||||
|
*/
|
||||||
|
final class AuthorizationServerContextFilter extends OncePerRequestFilter {
|
||||||
|
private final AuthorizationServerSettings authorizationServerSettings;
|
||||||
|
|
||||||
|
AuthorizationServerContextFilter(AuthorizationServerSettings authorizationServerSettings) {
|
||||||
|
Assert.notNull(authorizationServerSettings, "authorizationServerSettings cannot be null");
|
||||||
|
this.authorizationServerSettings = authorizationServerSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||||
|
throws ServletException, IOException {
|
||||||
|
|
||||||
|
try {
|
||||||
|
AuthorizationServerContext authorizationServerContext =
|
||||||
|
new DefaultAuthorizationServerContext(
|
||||||
|
() -> resolveIssuer(this.authorizationServerSettings, request),
|
||||||
|
this.authorizationServerSettings);
|
||||||
|
AuthorizationServerContextHolder.setContext(authorizationServerContext);
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
} finally {
|
||||||
|
AuthorizationServerContextHolder.resetContext();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String resolveIssuer(AuthorizationServerSettings authorizationServerSettings, HttpServletRequest request) {
|
||||||
|
return authorizationServerSettings.getIssuer() != null ?
|
||||||
|
authorizationServerSettings.getIssuer() :
|
||||||
|
getContextPath(request);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String getContextPath(HttpServletRequest request) {
|
||||||
|
// @formatter:off
|
||||||
|
return UriComponentsBuilder.fromHttpUrl(UrlUtils.buildFullRequestUrl(request))
|
||||||
|
.replacePath(request.getContextPath())
|
||||||
|
.replaceQuery(null)
|
||||||
|
.fragment(null)
|
||||||
|
.build()
|
||||||
|
.toUriString();
|
||||||
|
// @formatter:on
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final class DefaultAuthorizationServerContext implements AuthorizationServerContext {
|
||||||
|
private final Supplier<String> issuerSupplier;
|
||||||
|
private final AuthorizationServerSettings authorizationServerSettings;
|
||||||
|
|
||||||
|
private DefaultAuthorizationServerContext(Supplier<String> issuerSupplier, AuthorizationServerSettings authorizationServerSettings) {
|
||||||
|
this.issuerSupplier = issuerSupplier;
|
||||||
|
this.authorizationServerSettings = authorizationServerSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIssuer() {
|
||||||
|
return this.issuerSupplier.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuthorizationServerSettings getAuthorizationServerSettings() {
|
||||||
|
return this.authorizationServerSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -30,7 +30,7 @@ import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResp
|
|||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationException;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationException;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationCodeRequestAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationEndpointFilter;
|
||||||
import org.springframework.security.web.authentication.AuthenticationConverter;
|
import org.springframework.security.web.authentication.AuthenticationConverter;
|
||||||
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
||||||
@@ -132,7 +132,7 @@ public final class OAuth2AuthorizationEndpointConfigurer extends AbstractOAuth2C
|
|||||||
*
|
*
|
||||||
* <ul>
|
* <ul>
|
||||||
* <li>It must be an HTTP POST</li>
|
* <li>It must be an HTTP POST</li>
|
||||||
* <li>It must be submitted to {@link ProviderSettings#getAuthorizationEndpoint()} ()}</li>
|
* <li>It must be submitted to {@link AuthorizationServerSettings#getAuthorizationEndpoint()} ()}</li>
|
||||||
* <li>It must include the received {@code client_id} as an HTTP parameter</li>
|
* <li>It must include the received {@code client_id} as an HTTP parameter</li>
|
||||||
* <li>It must include the received {@code state} as an HTTP parameter</li>
|
* <li>It must include the received {@code state} as an HTTP parameter</li>
|
||||||
* <li>It must include the list of {@code scope}s the {@code Resource Owner}
|
* <li>It must include the list of {@code scope}s the {@code Resource Owner}
|
||||||
@@ -149,13 +149,13 @@ public final class OAuth2AuthorizationEndpointConfigurer extends AbstractOAuth2C
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
void init(HttpSecurity httpSecurity) {
|
void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
this.requestMatcher = new OrRequestMatcher(
|
this.requestMatcher = new OrRequestMatcher(
|
||||||
new AntPathRequestMatcher(
|
new AntPathRequestMatcher(
|
||||||
providerSettings.getAuthorizationEndpoint(),
|
authorizationServerSettings.getAuthorizationEndpoint(),
|
||||||
HttpMethod.GET.name()),
|
HttpMethod.GET.name()),
|
||||||
new AntPathRequestMatcher(
|
new AntPathRequestMatcher(
|
||||||
providerSettings.getAuthorizationEndpoint(),
|
authorizationServerSettings.getAuthorizationEndpoint(),
|
||||||
HttpMethod.POST.name()));
|
HttpMethod.POST.name()));
|
||||||
|
|
||||||
List<AuthenticationProvider> authenticationProviders =
|
List<AuthenticationProvider> authenticationProviders =
|
||||||
@@ -169,12 +169,12 @@ public final class OAuth2AuthorizationEndpointConfigurer extends AbstractOAuth2C
|
|||||||
@Override
|
@Override
|
||||||
void configure(HttpSecurity httpSecurity) {
|
void configure(HttpSecurity httpSecurity) {
|
||||||
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
|
|
||||||
OAuth2AuthorizationEndpointFilter authorizationEndpointFilter =
|
OAuth2AuthorizationEndpointFilter authorizationEndpointFilter =
|
||||||
new OAuth2AuthorizationEndpointFilter(
|
new OAuth2AuthorizationEndpointFilter(
|
||||||
authenticationManager,
|
authenticationManager,
|
||||||
providerSettings.getAuthorizationEndpoint());
|
authorizationServerSettings.getAuthorizationEndpoint());
|
||||||
if (this.authorizationRequestConverter != null) {
|
if (this.authorizationRequestConverter != null) {
|
||||||
authorizationEndpointFilter.setAuthenticationConverter(this.authorizationRequestConverter);
|
authorizationEndpointFilter.setAuthenticationConverter(this.authorizationRequestConverter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,11 +31,10 @@ import org.springframework.security.oauth2.core.OAuth2Token;
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.NimbusJwkSetEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.web.NimbusJwkSetEndpointFilter;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationServerMetadataEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.web.OAuth2AuthorizationServerMetadataEndpointFilter;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.ProviderContextFilter;
|
|
||||||
import org.springframework.security.web.authentication.HttpStatusEntryPoint;
|
import org.springframework.security.web.authentication.HttpStatusEntryPoint;
|
||||||
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
|
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
|
||||||
import org.springframework.security.web.context.SecurityContextHolderFilter;
|
import org.springframework.security.web.context.SecurityContextHolderFilter;
|
||||||
@@ -118,14 +117,14 @@ public final class OAuth2AuthorizationServerConfigurer
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the provider settings.
|
* Sets the authorization server settings.
|
||||||
*
|
*
|
||||||
* @param providerSettings the provider settings
|
* @param authorizationServerSettings the authorization server settings
|
||||||
* @return the {@link OAuth2AuthorizationServerConfigurer} for further configuration
|
* @return the {@link OAuth2AuthorizationServerConfigurer} for further configuration
|
||||||
*/
|
*/
|
||||||
public OAuth2AuthorizationServerConfigurer providerSettings(ProviderSettings providerSettings) {
|
public OAuth2AuthorizationServerConfigurer authorizationServerSettings(AuthorizationServerSettings authorizationServerSettings) {
|
||||||
Assert.notNull(providerSettings, "providerSettings cannot be null");
|
Assert.notNull(authorizationServerSettings, "authorizationServerSettings cannot be null");
|
||||||
getBuilder().setSharedObject(ProviderSettings.class, providerSettings);
|
getBuilder().setSharedObject(AuthorizationServerSettings.class, authorizationServerSettings);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,9 +220,9 @@ public final class OAuth2AuthorizationServerConfigurer
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void init(HttpSecurity httpSecurity) {
|
public void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
validateProviderSettings(providerSettings);
|
validateAuthorizationServerSettings(authorizationServerSettings);
|
||||||
initEndpointMatchers(providerSettings);
|
initEndpointMatchers(authorizationServerSettings);
|
||||||
|
|
||||||
this.configurers.values().forEach(configurer -> configurer.init(httpSecurity));
|
this.configurers.values().forEach(configurer -> configurer.init(httpSecurity));
|
||||||
|
|
||||||
@@ -243,20 +242,20 @@ public final class OAuth2AuthorizationServerConfigurer
|
|||||||
public void configure(HttpSecurity httpSecurity) {
|
public void configure(HttpSecurity httpSecurity) {
|
||||||
this.configurers.values().forEach(configurer -> configurer.configure(httpSecurity));
|
this.configurers.values().forEach(configurer -> configurer.configure(httpSecurity));
|
||||||
|
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
|
|
||||||
ProviderContextFilter providerContextFilter = new ProviderContextFilter(providerSettings);
|
AuthorizationServerContextFilter authorizationServerContextFilter = new AuthorizationServerContextFilter(authorizationServerSettings);
|
||||||
httpSecurity.addFilterAfter(postProcess(providerContextFilter), SecurityContextHolderFilter.class);
|
httpSecurity.addFilterAfter(postProcess(authorizationServerContextFilter), SecurityContextHolderFilter.class);
|
||||||
|
|
||||||
JWKSource<com.nimbusds.jose.proc.SecurityContext> jwkSource = OAuth2ConfigurerUtils.getJwkSource(httpSecurity);
|
JWKSource<com.nimbusds.jose.proc.SecurityContext> jwkSource = OAuth2ConfigurerUtils.getJwkSource(httpSecurity);
|
||||||
if (jwkSource != null) {
|
if (jwkSource != null) {
|
||||||
NimbusJwkSetEndpointFilter jwkSetEndpointFilter = new NimbusJwkSetEndpointFilter(
|
NimbusJwkSetEndpointFilter jwkSetEndpointFilter = new NimbusJwkSetEndpointFilter(
|
||||||
jwkSource, providerSettings.getJwkSetEndpoint());
|
jwkSource, authorizationServerSettings.getJwkSetEndpoint());
|
||||||
httpSecurity.addFilterBefore(postProcess(jwkSetEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class);
|
httpSecurity.addFilterBefore(postProcess(jwkSetEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
OAuth2AuthorizationServerMetadataEndpointFilter authorizationServerMetadataEndpointFilter =
|
OAuth2AuthorizationServerMetadataEndpointFilter authorizationServerMetadataEndpointFilter =
|
||||||
new OAuth2AuthorizationServerMetadataEndpointFilter(providerSettings);
|
new OAuth2AuthorizationServerMetadataEndpointFilter();
|
||||||
httpSecurity.addFilterBefore(postProcess(authorizationServerMetadataEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class);
|
httpSecurity.addFilterBefore(postProcess(authorizationServerMetadataEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -280,18 +279,18 @@ public final class OAuth2AuthorizationServerConfigurer
|
|||||||
return getConfigurer(configurerType).getRequestMatcher();
|
return getConfigurer(configurerType).getRequestMatcher();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void initEndpointMatchers(ProviderSettings providerSettings) {
|
private void initEndpointMatchers(AuthorizationServerSettings authorizationServerSettings) {
|
||||||
this.jwkSetEndpointMatcher = new AntPathRequestMatcher(
|
this.jwkSetEndpointMatcher = new AntPathRequestMatcher(
|
||||||
providerSettings.getJwkSetEndpoint(), HttpMethod.GET.name());
|
authorizationServerSettings.getJwkSetEndpoint(), HttpMethod.GET.name());
|
||||||
this.authorizationServerMetadataEndpointMatcher = new AntPathRequestMatcher(
|
this.authorizationServerMetadataEndpointMatcher = new AntPathRequestMatcher(
|
||||||
"/.well-known/oauth-authorization-server", HttpMethod.GET.name());
|
"/.well-known/oauth-authorization-server", HttpMethod.GET.name());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void validateProviderSettings(ProviderSettings providerSettings) {
|
private static void validateAuthorizationServerSettings(AuthorizationServerSettings authorizationServerSettings) {
|
||||||
if (providerSettings.getIssuer() != null) {
|
if (authorizationServerSettings.getIssuer() != null) {
|
||||||
URI issuerUri;
|
URI issuerUri;
|
||||||
try {
|
try {
|
||||||
issuerUri = new URI(providerSettings.getIssuer());
|
issuerUri = new URI(authorizationServerSettings.getIssuer());
|
||||||
issuerUri.toURL();
|
issuerUri.toURL();
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
throw new IllegalArgumentException("issuer must be a valid URL", ex);
|
throw new IllegalArgumentException("issuer must be a valid URL", ex);
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import org.springframework.security.oauth2.server.authorization.authentication.J
|
|||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.PublicClientAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.authentication.PublicClientAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.OAuth2ClientAuthenticationFilter;
|
import org.springframework.security.oauth2.server.authorization.web.OAuth2ClientAuthenticationFilter;
|
||||||
import org.springframework.security.web.authentication.AuthenticationConverter;
|
import org.springframework.security.web.authentication.AuthenticationConverter;
|
||||||
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
|
||||||
@@ -117,16 +117,16 @@ public final class OAuth2ClientAuthenticationConfigurer extends AbstractOAuth2Co
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
void init(HttpSecurity httpSecurity) {
|
void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
this.requestMatcher = new OrRequestMatcher(
|
this.requestMatcher = new OrRequestMatcher(
|
||||||
new AntPathRequestMatcher(
|
new AntPathRequestMatcher(
|
||||||
providerSettings.getTokenEndpoint(),
|
authorizationServerSettings.getTokenEndpoint(),
|
||||||
HttpMethod.POST.name()),
|
HttpMethod.POST.name()),
|
||||||
new AntPathRequestMatcher(
|
new AntPathRequestMatcher(
|
||||||
providerSettings.getTokenIntrospectionEndpoint(),
|
authorizationServerSettings.getTokenIntrospectionEndpoint(),
|
||||||
HttpMethod.POST.name()),
|
HttpMethod.POST.name()),
|
||||||
new AntPathRequestMatcher(
|
new AntPathRequestMatcher(
|
||||||
providerSettings.getTokenRevocationEndpoint(),
|
authorizationServerSettings.getTokenRevocationEndpoint(),
|
||||||
HttpMethod.POST.name()));
|
HttpMethod.POST.name()));
|
||||||
|
|
||||||
List<AuthenticationProvider> authenticationProviders =
|
List<AuthenticationProvider> authenticationProviders =
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ import org.springframework.security.oauth2.server.authorization.InMemoryOAuth2Au
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.JwtGenerator;
|
||||||
@@ -171,13 +171,13 @@ final class OAuth2ConfigurerUtils {
|
|||||||
return getOptionalBean(httpSecurity, type);
|
return getOptionalBean(httpSecurity, type);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ProviderSettings getProviderSettings(HttpSecurity httpSecurity) {
|
static AuthorizationServerSettings getAuthorizationServerSettings(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = httpSecurity.getSharedObject(ProviderSettings.class);
|
AuthorizationServerSettings authorizationServerSettings = httpSecurity.getSharedObject(AuthorizationServerSettings.class);
|
||||||
if (providerSettings == null) {
|
if (authorizationServerSettings == null) {
|
||||||
providerSettings = getBean(httpSecurity, ProviderSettings.class);
|
authorizationServerSettings = getBean(httpSecurity, AuthorizationServerSettings.class);
|
||||||
httpSecurity.setSharedObject(ProviderSettings.class, providerSettings);
|
httpSecurity.setSharedObject(AuthorizationServerSettings.class, authorizationServerSettings);
|
||||||
}
|
}
|
||||||
return providerSettings;
|
return authorizationServerSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
static <T> T getBean(HttpSecurity httpSecurity, Class<T> type) {
|
static <T> T getBean(HttpSecurity httpSecurity, Class<T> type) {
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ import org.springframework.security.oauth2.server.authorization.authentication.O
|
|||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2AuthorizationGrantAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientCredentialsAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientCredentialsAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2RefreshTokenAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2RefreshTokenAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.OAuth2TokenEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.web.OAuth2TokenEndpointFilter;
|
||||||
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
||||||
@@ -119,9 +119,9 @@ public final class OAuth2TokenEndpointConfigurer extends AbstractOAuth2Configure
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
void init(HttpSecurity httpSecurity) {
|
void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
this.requestMatcher = new AntPathRequestMatcher(
|
this.requestMatcher = new AntPathRequestMatcher(
|
||||||
providerSettings.getTokenEndpoint(), HttpMethod.POST.name());
|
authorizationServerSettings.getTokenEndpoint(), HttpMethod.POST.name());
|
||||||
|
|
||||||
List<AuthenticationProvider> authenticationProviders =
|
List<AuthenticationProvider> authenticationProviders =
|
||||||
!this.authenticationProviders.isEmpty() ?
|
!this.authenticationProviders.isEmpty() ?
|
||||||
@@ -134,12 +134,12 @@ public final class OAuth2TokenEndpointConfigurer extends AbstractOAuth2Configure
|
|||||||
@Override
|
@Override
|
||||||
void configure(HttpSecurity httpSecurity) {
|
void configure(HttpSecurity httpSecurity) {
|
||||||
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
|
|
||||||
OAuth2TokenEndpointFilter tokenEndpointFilter =
|
OAuth2TokenEndpointFilter tokenEndpointFilter =
|
||||||
new OAuth2TokenEndpointFilter(
|
new OAuth2TokenEndpointFilter(
|
||||||
authenticationManager,
|
authenticationManager,
|
||||||
providerSettings.getTokenEndpoint());
|
authorizationServerSettings.getTokenEndpoint());
|
||||||
if (this.accessTokenRequestConverter != null) {
|
if (this.accessTokenRequestConverter != null) {
|
||||||
tokenEndpointFilter.setAuthenticationConverter(this.accessTokenRequestConverter);
|
tokenEndpointFilter.setAuthenticationConverter(this.accessTokenRequestConverter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
|
|||||||
import org.springframework.security.oauth2.core.OAuth2Error;
|
import org.springframework.security.oauth2.core.OAuth2Error;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenIntrospectionAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.OAuth2TokenIntrospectionEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.web.OAuth2TokenIntrospectionEndpointFilter;
|
||||||
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
||||||
import org.springframework.security.web.authentication.AuthenticationConverter;
|
import org.springframework.security.web.authentication.AuthenticationConverter;
|
||||||
@@ -112,9 +112,9 @@ public final class OAuth2TokenIntrospectionEndpointConfigurer extends AbstractOA
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
void init(HttpSecurity httpSecurity) {
|
void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
this.requestMatcher = new AntPathRequestMatcher(
|
this.requestMatcher = new AntPathRequestMatcher(
|
||||||
providerSettings.getTokenIntrospectionEndpoint(), HttpMethod.POST.name());
|
authorizationServerSettings.getTokenIntrospectionEndpoint(), HttpMethod.POST.name());
|
||||||
|
|
||||||
List<AuthenticationProvider> authenticationProviders =
|
List<AuthenticationProvider> authenticationProviders =
|
||||||
!this.authenticationProviders.isEmpty() ?
|
!this.authenticationProviders.isEmpty() ?
|
||||||
@@ -127,11 +127,11 @@ public final class OAuth2TokenIntrospectionEndpointConfigurer extends AbstractOA
|
|||||||
@Override
|
@Override
|
||||||
void configure(HttpSecurity httpSecurity) {
|
void configure(HttpSecurity httpSecurity) {
|
||||||
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
|
|
||||||
OAuth2TokenIntrospectionEndpointFilter introspectionEndpointFilter =
|
OAuth2TokenIntrospectionEndpointFilter introspectionEndpointFilter =
|
||||||
new OAuth2TokenIntrospectionEndpointFilter(
|
new OAuth2TokenIntrospectionEndpointFilter(
|
||||||
authenticationManager, providerSettings.getTokenIntrospectionEndpoint());
|
authenticationManager, authorizationServerSettings.getTokenIntrospectionEndpoint());
|
||||||
if (this.introspectionRequestConverter != null) {
|
if (this.introspectionRequestConverter != null) {
|
||||||
introspectionEndpointFilter.setAuthenticationConverter(this.introspectionRequestConverter);
|
introspectionEndpointFilter.setAuthenticationConverter(this.introspectionRequestConverter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ import org.springframework.security.oauth2.core.OAuth2AuthenticationException;
|
|||||||
import org.springframework.security.oauth2.core.OAuth2Error;
|
import org.springframework.security.oauth2.core.OAuth2Error;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.web.OAuth2TokenRevocationEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.web.OAuth2TokenRevocationEndpointFilter;
|
||||||
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
||||||
import org.springframework.security.web.authentication.AuthenticationConverter;
|
import org.springframework.security.web.authentication.AuthenticationConverter;
|
||||||
@@ -111,9 +111,9 @@ public final class OAuth2TokenRevocationEndpointConfigurer extends AbstractOAuth
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
void init(HttpSecurity httpSecurity) {
|
void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
this.requestMatcher = new AntPathRequestMatcher(
|
this.requestMatcher = new AntPathRequestMatcher(
|
||||||
providerSettings.getTokenRevocationEndpoint(), HttpMethod.POST.name());
|
authorizationServerSettings.getTokenRevocationEndpoint(), HttpMethod.POST.name());
|
||||||
|
|
||||||
List<AuthenticationProvider> authenticationProviders =
|
List<AuthenticationProvider> authenticationProviders =
|
||||||
!this.authenticationProviders.isEmpty() ?
|
!this.authenticationProviders.isEmpty() ?
|
||||||
@@ -126,11 +126,11 @@ public final class OAuth2TokenRevocationEndpointConfigurer extends AbstractOAuth
|
|||||||
@Override
|
@Override
|
||||||
void configure(HttpSecurity httpSecurity) {
|
void configure(HttpSecurity httpSecurity) {
|
||||||
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
|
|
||||||
OAuth2TokenRevocationEndpointFilter revocationEndpointFilter =
|
OAuth2TokenRevocationEndpointFilter revocationEndpointFilter =
|
||||||
new OAuth2TokenRevocationEndpointFilter(
|
new OAuth2TokenRevocationEndpointFilter(
|
||||||
authenticationManager, providerSettings.getTokenRevocationEndpoint());
|
authenticationManager, authorizationServerSettings.getTokenRevocationEndpoint());
|
||||||
if (this.revocationRequestConverter != null) {
|
if (this.revocationRequestConverter != null) {
|
||||||
revocationEndpointFilter.setAuthenticationConverter(this.revocationRequestConverter);
|
revocationEndpointFilter.setAuthenticationConverter(this.revocationRequestConverter);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ import org.springframework.security.config.annotation.ObjectPostProcessor;
|
|||||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcClientRegistrationAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcClientRegistrationAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.web.OidcClientRegistrationEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.oidc.web.OidcClientRegistrationEndpointFilter;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
||||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
import org.springframework.security.web.util.matcher.OrRequestMatcher;
|
import org.springframework.security.web.util.matcher.OrRequestMatcher;
|
||||||
@@ -47,10 +47,10 @@ public final class OidcClientRegistrationEndpointConfigurer extends AbstractOAut
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
void init(HttpSecurity httpSecurity) {
|
void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
this.requestMatcher = new OrRequestMatcher(
|
this.requestMatcher = new OrRequestMatcher(
|
||||||
new AntPathRequestMatcher(providerSettings.getOidcClientRegistrationEndpoint(), HttpMethod.POST.name()),
|
new AntPathRequestMatcher(authorizationServerSettings.getOidcClientRegistrationEndpoint(), HttpMethod.POST.name()),
|
||||||
new AntPathRequestMatcher(providerSettings.getOidcClientRegistrationEndpoint(), HttpMethod.GET.name())
|
new AntPathRequestMatcher(authorizationServerSettings.getOidcClientRegistrationEndpoint(), HttpMethod.GET.name())
|
||||||
);
|
);
|
||||||
|
|
||||||
OidcClientRegistrationAuthenticationProvider oidcClientRegistrationAuthenticationProvider =
|
OidcClientRegistrationAuthenticationProvider oidcClientRegistrationAuthenticationProvider =
|
||||||
@@ -64,12 +64,12 @@ public final class OidcClientRegistrationEndpointConfigurer extends AbstractOAut
|
|||||||
@Override
|
@Override
|
||||||
void configure(HttpSecurity httpSecurity) {
|
void configure(HttpSecurity httpSecurity) {
|
||||||
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
|
|
||||||
OidcClientRegistrationEndpointFilter oidcClientRegistrationEndpointFilter =
|
OidcClientRegistrationEndpointFilter oidcClientRegistrationEndpointFilter =
|
||||||
new OidcClientRegistrationEndpointFilter(
|
new OidcClientRegistrationEndpointFilter(
|
||||||
authenticationManager,
|
authenticationManager,
|
||||||
providerSettings.getOidcClientRegistrationEndpoint());
|
authorizationServerSettings.getOidcClientRegistrationEndpoint());
|
||||||
httpSecurity.addFilterAfter(postProcess(oidcClientRegistrationEndpointFilter), FilterSecurityInterceptor.class);
|
httpSecurity.addFilterAfter(postProcess(oidcClientRegistrationEndpointFilter), FilterSecurityInterceptor.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -25,7 +25,6 @@ import org.springframework.security.config.Customizer;
|
|||||||
import org.springframework.security.config.annotation.ObjectPostProcessor;
|
import org.springframework.security.config.annotation.ObjectPostProcessor;
|
||||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.web.OidcProviderConfigurationEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.oidc.web.OidcProviderConfigurationEndpointFilter;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
|
import org.springframework.security.web.authentication.preauth.AbstractPreAuthenticatedProcessingFilter;
|
||||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
import org.springframework.security.web.util.matcher.OrRequestMatcher;
|
import org.springframework.security.web.util.matcher.OrRequestMatcher;
|
||||||
@@ -114,9 +113,8 @@ public final class OidcConfigurer extends AbstractOAuth2Configurer {
|
|||||||
clientRegistrationEndpointConfigurer.configure(httpSecurity);
|
clientRegistrationEndpointConfigurer.configure(httpSecurity);
|
||||||
}
|
}
|
||||||
|
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
|
||||||
OidcProviderConfigurationEndpointFilter oidcProviderConfigurationEndpointFilter =
|
OidcProviderConfigurationEndpointFilter oidcProviderConfigurationEndpointFilter =
|
||||||
new OidcProviderConfigurationEndpointFilter(providerSettings);
|
new OidcProviderConfigurationEndpointFilter();
|
||||||
httpSecurity.addFilterBefore(postProcess(oidcProviderConfigurationEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class);
|
httpSecurity.addFilterBefore(postProcess(oidcProviderConfigurationEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ import org.springframework.security.oauth2.server.authorization.oidc.authenticat
|
|||||||
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationProvider;
|
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.web.OidcUserInfoEndpointFilter;
|
import org.springframework.security.oauth2.server.authorization.oidc.web.OidcUserInfoEndpointFilter;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
||||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
import org.springframework.security.web.util.matcher.OrRequestMatcher;
|
import org.springframework.security.web.util.matcher.OrRequestMatcher;
|
||||||
@@ -76,8 +76,8 @@ public final class OidcUserInfoEndpointConfigurer extends AbstractOAuth2Configur
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
void init(HttpSecurity httpSecurity) {
|
void init(HttpSecurity httpSecurity) {
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
String userInfoEndpointUri = providerSettings.getOidcUserInfoEndpoint();
|
String userInfoEndpointUri = authorizationServerSettings.getOidcUserInfoEndpoint();
|
||||||
this.requestMatcher = new OrRequestMatcher(
|
this.requestMatcher = new OrRequestMatcher(
|
||||||
new AntPathRequestMatcher(userInfoEndpointUri, HttpMethod.GET.name()),
|
new AntPathRequestMatcher(userInfoEndpointUri, HttpMethod.GET.name()),
|
||||||
new AntPathRequestMatcher(userInfoEndpointUri, HttpMethod.POST.name()));
|
new AntPathRequestMatcher(userInfoEndpointUri, HttpMethod.POST.name()));
|
||||||
@@ -94,12 +94,12 @@ public final class OidcUserInfoEndpointConfigurer extends AbstractOAuth2Configur
|
|||||||
@Override
|
@Override
|
||||||
void configure(HttpSecurity httpSecurity) {
|
void configure(HttpSecurity httpSecurity) {
|
||||||
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
AuthenticationManager authenticationManager = httpSecurity.getSharedObject(AuthenticationManager.class);
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(httpSecurity);
|
AuthorizationServerSettings authorizationServerSettings = OAuth2ConfigurerUtils.getAuthorizationServerSettings(httpSecurity);
|
||||||
|
|
||||||
OidcUserInfoEndpointFilter oidcUserInfoEndpointFilter =
|
OidcUserInfoEndpointFilter oidcUserInfoEndpointFilter =
|
||||||
new OidcUserInfoEndpointFilter(
|
new OidcUserInfoEndpointFilter(
|
||||||
authenticationManager,
|
authenticationManager,
|
||||||
providerSettings.getOidcUserInfoEndpoint());
|
authorizationServerSettings.getOidcUserInfoEndpoint());
|
||||||
httpSecurity.addFilterAfter(postProcess(oidcUserInfoEndpointFilter), FilterSecurityInterceptor.class);
|
httpSecurity.addFilterAfter(postProcess(oidcUserInfoEndpointFilter), FilterSecurityInterceptor.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,44 @@
|
|||||||
|
/*
|
||||||
|
* 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.context;
|
||||||
|
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A context that holds information of the Authorization Server runtime environment.
|
||||||
|
*
|
||||||
|
* @author Joe Grandja
|
||||||
|
* @since 0.2.2
|
||||||
|
* @see AuthorizationServerSettings
|
||||||
|
* @see AuthorizationServerContextHolder
|
||||||
|
*/
|
||||||
|
public interface AuthorizationServerContext {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@code URL} of the Authorization Server's issuer identifier.
|
||||||
|
*
|
||||||
|
* @return the {@code URL} of the Authorization Server's issuer identifier
|
||||||
|
*/
|
||||||
|
String getIssuer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link AuthorizationServerSettings}.
|
||||||
|
*
|
||||||
|
* @return the {@link AuthorizationServerSettings}
|
||||||
|
*/
|
||||||
|
AuthorizationServerSettings getAuthorizationServerSettings();
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
* 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.context;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A holder of the {@link AuthorizationServerContext} that associates it with the current thread using a {@code ThreadLocal}.
|
||||||
|
*
|
||||||
|
* @author Joe Grandja
|
||||||
|
* @since 0.2.2
|
||||||
|
* @see AuthorizationServerContext
|
||||||
|
*/
|
||||||
|
public final class AuthorizationServerContextHolder {
|
||||||
|
private static final ThreadLocal<AuthorizationServerContext> holder = new ThreadLocal<>();
|
||||||
|
|
||||||
|
private AuthorizationServerContextHolder() {
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the {@link AuthorizationServerContext} bound to the current thread.
|
||||||
|
*
|
||||||
|
* @return the {@link AuthorizationServerContext}
|
||||||
|
*/
|
||||||
|
public static AuthorizationServerContext getContext() {
|
||||||
|
return holder.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bind the given {@link AuthorizationServerContext} to the current thread.
|
||||||
|
*
|
||||||
|
* @param authorizationServerContext the {@link AuthorizationServerContext}
|
||||||
|
*/
|
||||||
|
public static void setContext(AuthorizationServerContext authorizationServerContext) {
|
||||||
|
if (authorizationServerContext == null) {
|
||||||
|
resetContext();
|
||||||
|
} else {
|
||||||
|
holder.set(authorizationServerContext);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Reset the {@link AuthorizationServerContext} bound to the current thread.
|
||||||
|
*/
|
||||||
|
public static void resetContext() {
|
||||||
|
holder.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -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.context;
|
|
||||||
|
|
||||||
import java.util.function.Supplier;
|
|
||||||
|
|
||||||
import org.springframework.lang.Nullable;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.util.Assert;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A context that holds information of the Provider.
|
|
||||||
*
|
|
||||||
* @author Joe Grandja
|
|
||||||
* @since 0.2.2
|
|
||||||
* @see ProviderSettings
|
|
||||||
* @see ProviderContextHolder
|
|
||||||
*/
|
|
||||||
public final class ProviderContext {
|
|
||||||
private final ProviderSettings providerSettings;
|
|
||||||
private final Supplier<String> issuerSupplier;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a {@code ProviderContext} using the provided parameters.
|
|
||||||
*
|
|
||||||
* @param providerSettings the provider settings
|
|
||||||
* @param issuerSupplier a {@code Supplier} for the {@code URL} of the Provider's issuer identifier
|
|
||||||
*/
|
|
||||||
public ProviderContext(ProviderSettings providerSettings, @Nullable Supplier<String> issuerSupplier) {
|
|
||||||
Assert.notNull(providerSettings, "providerSettings cannot be null");
|
|
||||||
this.providerSettings = providerSettings;
|
|
||||||
this.issuerSupplier = issuerSupplier;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@link ProviderSettings}.
|
|
||||||
*
|
|
||||||
* @return the {@link ProviderSettings}
|
|
||||||
*/
|
|
||||||
public ProviderSettings getProviderSettings() {
|
|
||||||
return this.providerSettings;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@code URL} of the Provider's issuer identifier.
|
|
||||||
* The issuer identifier is resolved from the constructor parameter {@code Supplier<String>}
|
|
||||||
* or if not provided then defaults to {@link ProviderSettings#getIssuer()}.
|
|
||||||
*
|
|
||||||
* @return the {@code URL} of the Provider's issuer identifier
|
|
||||||
*/
|
|
||||||
public String getIssuer() {
|
|
||||||
return this.issuerSupplier != null ?
|
|
||||||
this.issuerSupplier.get() :
|
|
||||||
getProviderSettings().getIssuer();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,63 +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.context;
|
|
||||||
|
|
||||||
import org.springframework.security.oauth2.server.authorization.web.ProviderContextFilter;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A holder of {@link ProviderContext} that associates it with the current thread using a {@code ThreadLocal}.
|
|
||||||
*
|
|
||||||
* @author Joe Grandja
|
|
||||||
* @since 0.2.2
|
|
||||||
* @see ProviderContext
|
|
||||||
* @see ProviderContextFilter
|
|
||||||
*/
|
|
||||||
public final class ProviderContextHolder {
|
|
||||||
private static final ThreadLocal<ProviderContext> holder = new ThreadLocal<>();
|
|
||||||
|
|
||||||
private ProviderContextHolder() {
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the {@link ProviderContext} bound to the current thread.
|
|
||||||
*
|
|
||||||
* @return the {@link ProviderContext}
|
|
||||||
*/
|
|
||||||
public static ProviderContext getProviderContext() {
|
|
||||||
return holder.get();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bind the given {@link ProviderContext} to the current thread.
|
|
||||||
*
|
|
||||||
* @param providerContext the {@link ProviderContext}
|
|
||||||
*/
|
|
||||||
public static void setProviderContext(ProviderContext providerContext) {
|
|
||||||
if (providerContext == null) {
|
|
||||||
resetProviderContext();
|
|
||||||
} else {
|
|
||||||
holder.set(providerContext);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Reset the {@link ProviderContext} bound to the current thread.
|
|
||||||
*/
|
|
||||||
public static void resetProviderContext() {
|
|
||||||
holder.remove();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -49,8 +49,8 @@ import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
|||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientMetadataClaimNames;
|
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientMetadataClaimNames;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration;
|
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
@@ -212,7 +212,7 @@ public final class OidcClientRegistrationAuthenticationProvider implements Authe
|
|||||||
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(clientPrincipal)
|
.principal(clientPrincipal)
|
||||||
.providerContext(ProviderContextHolder.getProviderContext())
|
.authorizationServerContext(AuthorizationServerContextHolder.getContext())
|
||||||
.authorizedScopes(authorizedScopes)
|
.authorizedScopes(authorizedScopes)
|
||||||
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
||||||
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
|
.authorizationGrantType(AuthorizationGrantType.CLIENT_CREDENTIALS)
|
||||||
@@ -276,9 +276,9 @@ public final class OidcClientRegistrationAuthenticationProvider implements Authe
|
|||||||
scopes.addAll(registeredClient.getScopes()));
|
scopes.addAll(registeredClient.getScopes()));
|
||||||
}
|
}
|
||||||
|
|
||||||
ProviderContext providerContext = ProviderContextHolder.getProviderContext();
|
AuthorizationServerContext authorizationServerContext = AuthorizationServerContextHolder.getContext();
|
||||||
String registrationClientUri = UriComponentsBuilder.fromUriString(providerContext.getIssuer())
|
String registrationClientUri = UriComponentsBuilder.fromUriString(authorizationServerContext.getIssuer())
|
||||||
.path(providerContext.getProviderSettings().getOidcClientRegistrationEndpoint())
|
.path(authorizationServerContext.getAuthorizationServerSettings().getOidcClientRegistrationEndpoint())
|
||||||
.queryParam(OAuth2ParameterNames.CLIENT_ID, registeredClient.getClientId())
|
.queryParam(OAuth2ParameterNames.CLIENT_ID, registeredClient.getClientId())
|
||||||
.toUriString();
|
.toUriString();
|
||||||
|
|
||||||
|
|||||||
@@ -32,13 +32,13 @@ import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
|
|||||||
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
||||||
import org.springframework.security.oauth2.core.oidc.OidcScopes;
|
import org.springframework.security.oauth2.core.oidc.OidcScopes;
|
||||||
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
|
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.OidcProviderConfiguration;
|
import org.springframework.security.oauth2.server.authorization.oidc.OidcProviderConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.http.converter.OidcProviderConfigurationHttpMessageConverter;
|
import org.springframework.security.oauth2.server.authorization.oidc.http.converter.OidcProviderConfigurationHttpMessageConverter;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
import org.springframework.security.web.util.matcher.RequestMatcher;
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||||
import org.springframework.util.Assert;
|
|
||||||
import org.springframework.web.filter.OncePerRequestFilter;
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
import org.springframework.web.util.UriComponentsBuilder;
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
@@ -48,7 +48,7 @@ import org.springframework.web.util.UriComponentsBuilder;
|
|||||||
* @author Daniel Garnier-Moiroux
|
* @author Daniel Garnier-Moiroux
|
||||||
* @since 0.1.0
|
* @since 0.1.0
|
||||||
* @see OidcProviderConfiguration
|
* @see OidcProviderConfiguration
|
||||||
* @see ProviderSettings
|
* @see AuthorizationServerSettings
|
||||||
* @see <a target="_blank" href="https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest">4.1. OpenID Provider Configuration Request</a>
|
* @see <a target="_blank" href="https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderConfigurationRequest">4.1. OpenID Provider Configuration Request</a>
|
||||||
*/
|
*/
|
||||||
public final class OidcProviderConfigurationEndpointFilter extends OncePerRequestFilter {
|
public final class OidcProviderConfigurationEndpointFilter extends OncePerRequestFilter {
|
||||||
@@ -57,20 +57,12 @@ public final class OidcProviderConfigurationEndpointFilter extends OncePerReques
|
|||||||
*/
|
*/
|
||||||
private static final String DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI = "/.well-known/openid-configuration";
|
private static final String DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI = "/.well-known/openid-configuration";
|
||||||
|
|
||||||
private final ProviderSettings providerSettings;
|
private final RequestMatcher requestMatcher = new AntPathRequestMatcher(
|
||||||
private final RequestMatcher requestMatcher;
|
DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI,
|
||||||
|
HttpMethod.GET.name());
|
||||||
private final OidcProviderConfigurationHttpMessageConverter providerConfigurationHttpMessageConverter =
|
private final OidcProviderConfigurationHttpMessageConverter providerConfigurationHttpMessageConverter =
|
||||||
new OidcProviderConfigurationHttpMessageConverter();
|
new OidcProviderConfigurationHttpMessageConverter();
|
||||||
|
|
||||||
public OidcProviderConfigurationEndpointFilter(ProviderSettings providerSettings) {
|
|
||||||
Assert.notNull(providerSettings, "providerSettings cannot be null");
|
|
||||||
this.providerSettings = providerSettings;
|
|
||||||
this.requestMatcher = new AntPathRequestMatcher(
|
|
||||||
DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI,
|
|
||||||
HttpMethod.GET.name()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
@@ -80,22 +72,24 @@ public final class OidcProviderConfigurationEndpointFilter extends OncePerReques
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String issuer = ProviderContextHolder.getProviderContext().getIssuer();
|
AuthorizationServerContext authorizationServerContext = AuthorizationServerContextHolder.getContext();
|
||||||
|
String issuer = authorizationServerContext.getIssuer();
|
||||||
|
AuthorizationServerSettings authorizationServerSettings = authorizationServerContext.getAuthorizationServerSettings();
|
||||||
|
|
||||||
OidcProviderConfiguration providerConfiguration = OidcProviderConfiguration.builder()
|
OidcProviderConfiguration providerConfiguration = OidcProviderConfiguration.builder()
|
||||||
.issuer(issuer)
|
.issuer(issuer)
|
||||||
.authorizationEndpoint(asUrl(issuer, this.providerSettings.getAuthorizationEndpoint()))
|
.authorizationEndpoint(asUrl(issuer, authorizationServerSettings.getAuthorizationEndpoint()))
|
||||||
.tokenEndpoint(asUrl(issuer, this.providerSettings.getTokenEndpoint()))
|
.tokenEndpoint(asUrl(issuer, authorizationServerSettings.getTokenEndpoint()))
|
||||||
.tokenEndpointAuthenticationMethods(clientAuthenticationMethods())
|
.tokenEndpointAuthenticationMethods(clientAuthenticationMethods())
|
||||||
.jwkSetUrl(asUrl(issuer, this.providerSettings.getJwkSetEndpoint()))
|
.jwkSetUrl(asUrl(issuer, authorizationServerSettings.getJwkSetEndpoint()))
|
||||||
.userInfoEndpoint(asUrl(issuer, this.providerSettings.getOidcUserInfoEndpoint()))
|
.userInfoEndpoint(asUrl(issuer, authorizationServerSettings.getOidcUserInfoEndpoint()))
|
||||||
.responseType(OAuth2AuthorizationResponseType.CODE.getValue())
|
.responseType(OAuth2AuthorizationResponseType.CODE.getValue())
|
||||||
.grantType(AuthorizationGrantType.AUTHORIZATION_CODE.getValue())
|
.grantType(AuthorizationGrantType.AUTHORIZATION_CODE.getValue())
|
||||||
.grantType(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue())
|
.grantType(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue())
|
||||||
.grantType(AuthorizationGrantType.REFRESH_TOKEN.getValue())
|
.grantType(AuthorizationGrantType.REFRESH_TOKEN.getValue())
|
||||||
.tokenRevocationEndpoint(asUrl(issuer, this.providerSettings.getTokenRevocationEndpoint()))
|
.tokenRevocationEndpoint(asUrl(issuer, authorizationServerSettings.getTokenRevocationEndpoint()))
|
||||||
.tokenRevocationEndpointAuthenticationMethods(clientAuthenticationMethods())
|
.tokenRevocationEndpointAuthenticationMethods(clientAuthenticationMethods())
|
||||||
.tokenIntrospectionEndpoint(asUrl(issuer, this.providerSettings.getTokenIntrospectionEndpoint()))
|
.tokenIntrospectionEndpoint(asUrl(issuer, authorizationServerSettings.getTokenIntrospectionEndpoint()))
|
||||||
.tokenIntrospectionEndpointAuthenticationMethods(clientAuthenticationMethods())
|
.tokenIntrospectionEndpointAuthenticationMethods(clientAuthenticationMethods())
|
||||||
.subjectType("public")
|
.subjectType("public")
|
||||||
.idTokenSigningAlgorithm(SignatureAlgorithm.RS256.getName())
|
.idTokenSigningAlgorithm(SignatureAlgorithm.RS256.getName())
|
||||||
@@ -119,4 +113,5 @@ public final class OidcProviderConfigurationEndpointFilter extends OncePerReques
|
|||||||
private static String asUrl(String issuer, String endpoint) {
|
private static String asUrl(String issuer, String endpoint) {
|
||||||
return UriComponentsBuilder.fromUriString(issuer).path(endpoint).build().toUriString();
|
return UriComponentsBuilder.fromUriString(issuer).path(endpoint).build().toUriString();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,90 +20,90 @@ import java.util.Map;
|
|||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A facility for provider configuration settings.
|
* A facility for authorization server configuration settings.
|
||||||
*
|
*
|
||||||
* @author Daniel Garnier-Moiroux
|
* @author Daniel Garnier-Moiroux
|
||||||
* @author Joe Grandja
|
* @author Joe Grandja
|
||||||
* @since 0.1.0
|
* @since 0.1.0
|
||||||
* @see AbstractSettings
|
* @see AbstractSettings
|
||||||
* @see ConfigurationSettingNames.Provider
|
* @see ConfigurationSettingNames.AuthorizationServer
|
||||||
*/
|
*/
|
||||||
public final class ProviderSettings extends AbstractSettings {
|
public final class AuthorizationServerSettings extends AbstractSettings {
|
||||||
|
|
||||||
private ProviderSettings(Map<String, Object> settings) {
|
private AuthorizationServerSettings(Map<String, Object> settings) {
|
||||||
super(settings);
|
super(settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the URL of the Provider's Issuer Identifier
|
* Returns the URL of the Authorization Server's Issuer Identifier
|
||||||
*
|
*
|
||||||
* @return the URL of the Provider's Issuer Identifier
|
* @return the URL of the Authorization Server's Issuer Identifier
|
||||||
*/
|
*/
|
||||||
public String getIssuer() {
|
public String getIssuer() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.ISSUER);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.ISSUER);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Provider's OAuth 2.0 Authorization endpoint. The default is {@code /oauth2/authorize}.
|
* Returns the OAuth 2.0 Authorization endpoint. The default is {@code /oauth2/authorize}.
|
||||||
*
|
*
|
||||||
* @return the Authorization endpoint
|
* @return the Authorization endpoint
|
||||||
*/
|
*/
|
||||||
public String getAuthorizationEndpoint() {
|
public String getAuthorizationEndpoint() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.AUTHORIZATION_ENDPOINT);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.AUTHORIZATION_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Provider's OAuth 2.0 Token endpoint. The default is {@code /oauth2/token}.
|
* Returns the OAuth 2.0 Token endpoint. The default is {@code /oauth2/token}.
|
||||||
*
|
*
|
||||||
* @return the Token endpoint
|
* @return the Token endpoint
|
||||||
*/
|
*/
|
||||||
public String getTokenEndpoint() {
|
public String getTokenEndpoint() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.TOKEN_ENDPOINT);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.TOKEN_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Provider's JWK Set endpoint. The default is {@code /oauth2/jwks}.
|
* Returns the JWK Set endpoint. The default is {@code /oauth2/jwks}.
|
||||||
*
|
*
|
||||||
* @return the JWK Set endpoint
|
* @return the JWK Set endpoint
|
||||||
*/
|
*/
|
||||||
public String getJwkSetEndpoint() {
|
public String getJwkSetEndpoint() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.JWK_SET_ENDPOINT);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.JWK_SET_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Provider's OAuth 2.0 Token Revocation endpoint. The default is {@code /oauth2/revoke}.
|
* Returns the OAuth 2.0 Token Revocation endpoint. The default is {@code /oauth2/revoke}.
|
||||||
*
|
*
|
||||||
* @return the Token Revocation endpoint
|
* @return the Token Revocation endpoint
|
||||||
*/
|
*/
|
||||||
public String getTokenRevocationEndpoint() {
|
public String getTokenRevocationEndpoint() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.TOKEN_REVOCATION_ENDPOINT);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.TOKEN_REVOCATION_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Provider's OAuth 2.0 Token Introspection endpoint. The default is {@code /oauth2/introspect}.
|
* Returns the OAuth 2.0 Token Introspection endpoint. The default is {@code /oauth2/introspect}.
|
||||||
*
|
*
|
||||||
* @return the Token Introspection endpoint
|
* @return the Token Introspection endpoint
|
||||||
*/
|
*/
|
||||||
public String getTokenIntrospectionEndpoint() {
|
public String getTokenIntrospectionEndpoint() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.TOKEN_INTROSPECTION_ENDPOINT);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.TOKEN_INTROSPECTION_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Provider's OpenID Connect 1.0 Client Registration endpoint. The default is {@code /connect/register}.
|
* Returns the OpenID Connect 1.0 Client Registration endpoint. The default is {@code /connect/register}.
|
||||||
*
|
*
|
||||||
* @return the OpenID Connect 1.0 Client Registration endpoint
|
* @return the OpenID Connect 1.0 Client Registration endpoint
|
||||||
*/
|
*/
|
||||||
public String getOidcClientRegistrationEndpoint() {
|
public String getOidcClientRegistrationEndpoint() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.OIDC_CLIENT_REGISTRATION_ENDPOINT);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.OIDC_CLIENT_REGISTRATION_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the Provider's OpenID Connect 1.0 UserInfo endpoint. The default is {@code /userinfo}.
|
* Returns the OpenID Connect 1.0 UserInfo endpoint. The default is {@code /userinfo}.
|
||||||
*
|
*
|
||||||
* @return the OpenID Connect 1.0 UserInfo endpoint
|
* @return the OpenID Connect 1.0 UserInfo endpoint
|
||||||
*/
|
*/
|
||||||
public String getOidcUserInfoEndpoint() {
|
public String getOidcUserInfoEndpoint() {
|
||||||
return getSetting(ConfigurationSettingNames.Provider.OIDC_USER_INFO_ENDPOINT);
|
return getSetting(ConfigurationSettingNames.AuthorizationServer.OIDC_USER_INFO_ENDPOINT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,101 +135,101 @@ public final class ProviderSettings extends AbstractSettings {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A builder for {@link ProviderSettings}.
|
* A builder for {@link AuthorizationServerSettings}.
|
||||||
*/
|
*/
|
||||||
public final static class Builder extends AbstractBuilder<ProviderSettings, Builder> {
|
public final static class Builder extends AbstractBuilder<AuthorizationServerSettings, Builder> {
|
||||||
|
|
||||||
private Builder() {
|
private Builder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the URL the Provider uses as its Issuer Identifier.
|
* Sets the URL the Authorization Server uses as its Issuer Identifier.
|
||||||
*
|
*
|
||||||
* @param issuer the URL the Provider uses as its Issuer Identifier.
|
* @param issuer the URL the Authorization Server uses as its Issuer Identifier.
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder issuer(String issuer) {
|
public Builder issuer(String issuer) {
|
||||||
return setting(ConfigurationSettingNames.Provider.ISSUER, issuer);
|
return setting(ConfigurationSettingNames.AuthorizationServer.ISSUER, issuer);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Provider's OAuth 2.0 Authorization endpoint.
|
* Sets the OAuth 2.0 Authorization endpoint.
|
||||||
*
|
*
|
||||||
* @param authorizationEndpoint the Authorization endpoint
|
* @param authorizationEndpoint the Authorization endpoint
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder authorizationEndpoint(String authorizationEndpoint) {
|
public Builder authorizationEndpoint(String authorizationEndpoint) {
|
||||||
return setting(ConfigurationSettingNames.Provider.AUTHORIZATION_ENDPOINT, authorizationEndpoint);
|
return setting(ConfigurationSettingNames.AuthorizationServer.AUTHORIZATION_ENDPOINT, authorizationEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Provider's OAuth 2.0 Token endpoint.
|
* Sets the OAuth 2.0 Token endpoint.
|
||||||
*
|
*
|
||||||
* @param tokenEndpoint the Token endpoint
|
* @param tokenEndpoint the Token endpoint
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder tokenEndpoint(String tokenEndpoint) {
|
public Builder tokenEndpoint(String tokenEndpoint) {
|
||||||
return setting(ConfigurationSettingNames.Provider.TOKEN_ENDPOINT, tokenEndpoint);
|
return setting(ConfigurationSettingNames.AuthorizationServer.TOKEN_ENDPOINT, tokenEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Provider's JWK Set endpoint.
|
* Sets the JWK Set endpoint.
|
||||||
*
|
*
|
||||||
* @param jwkSetEndpoint the JWK Set endpoint
|
* @param jwkSetEndpoint the JWK Set endpoint
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder jwkSetEndpoint(String jwkSetEndpoint) {
|
public Builder jwkSetEndpoint(String jwkSetEndpoint) {
|
||||||
return setting(ConfigurationSettingNames.Provider.JWK_SET_ENDPOINT, jwkSetEndpoint);
|
return setting(ConfigurationSettingNames.AuthorizationServer.JWK_SET_ENDPOINT, jwkSetEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Provider's OAuth 2.0 Token Revocation endpoint.
|
* Sets the OAuth 2.0 Token Revocation endpoint.
|
||||||
*
|
*
|
||||||
* @param tokenRevocationEndpoint the Token Revocation endpoint
|
* @param tokenRevocationEndpoint the Token Revocation endpoint
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder tokenRevocationEndpoint(String tokenRevocationEndpoint) {
|
public Builder tokenRevocationEndpoint(String tokenRevocationEndpoint) {
|
||||||
return setting(ConfigurationSettingNames.Provider.TOKEN_REVOCATION_ENDPOINT, tokenRevocationEndpoint);
|
return setting(ConfigurationSettingNames.AuthorizationServer.TOKEN_REVOCATION_ENDPOINT, tokenRevocationEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Provider's OAuth 2.0 Token Introspection endpoint.
|
* Sets the OAuth 2.0 Token Introspection endpoint.
|
||||||
*
|
*
|
||||||
* @param tokenIntrospectionEndpoint the Token Introspection endpoint
|
* @param tokenIntrospectionEndpoint the Token Introspection endpoint
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder tokenIntrospectionEndpoint(String tokenIntrospectionEndpoint) {
|
public Builder tokenIntrospectionEndpoint(String tokenIntrospectionEndpoint) {
|
||||||
return setting(ConfigurationSettingNames.Provider.TOKEN_INTROSPECTION_ENDPOINT, tokenIntrospectionEndpoint);
|
return setting(ConfigurationSettingNames.AuthorizationServer.TOKEN_INTROSPECTION_ENDPOINT, tokenIntrospectionEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Provider's OpenID Connect 1.0 Client Registration endpoint.
|
* Sets the OpenID Connect 1.0 Client Registration endpoint.
|
||||||
*
|
*
|
||||||
* @param oidcClientRegistrationEndpoint the OpenID Connect 1.0 Client Registration endpoint
|
* @param oidcClientRegistrationEndpoint the OpenID Connect 1.0 Client Registration endpoint
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder oidcClientRegistrationEndpoint(String oidcClientRegistrationEndpoint) {
|
public Builder oidcClientRegistrationEndpoint(String oidcClientRegistrationEndpoint) {
|
||||||
return setting(ConfigurationSettingNames.Provider.OIDC_CLIENT_REGISTRATION_ENDPOINT, oidcClientRegistrationEndpoint);
|
return setting(ConfigurationSettingNames.AuthorizationServer.OIDC_CLIENT_REGISTRATION_ENDPOINT, oidcClientRegistrationEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the Provider's OpenID Connect 1.0 UserInfo endpoint.
|
* Sets the OpenID Connect 1.0 UserInfo endpoint.
|
||||||
*
|
*
|
||||||
* @param oidcUserInfoEndpoint the OpenID Connect 1.0 UserInfo endpoint
|
* @param oidcUserInfoEndpoint the OpenID Connect 1.0 UserInfo endpoint
|
||||||
* @return the {@link Builder} for further configuration
|
* @return the {@link Builder} for further configuration
|
||||||
*/
|
*/
|
||||||
public Builder oidcUserInfoEndpoint(String oidcUserInfoEndpoint) {
|
public Builder oidcUserInfoEndpoint(String oidcUserInfoEndpoint) {
|
||||||
return setting(ConfigurationSettingNames.Provider.OIDC_USER_INFO_ENDPOINT, oidcUserInfoEndpoint);
|
return setting(ConfigurationSettingNames.AuthorizationServer.OIDC_USER_INFO_ENDPOINT, oidcUserInfoEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Builds the {@link ProviderSettings}.
|
* Builds the {@link AuthorizationServerSettings}.
|
||||||
*
|
*
|
||||||
* @return the {@link ProviderSettings}
|
* @return the {@link AuthorizationServerSettings}
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public ProviderSettings build() {
|
public AuthorizationServerSettings build() {
|
||||||
return new ProviderSettings(getSettings());
|
return new AuthorizationServerSettings(getSettings());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -71,52 +71,52 @@ public final class ConfigurationSettingNames {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The names for provider configuration settings.
|
* The names for authorization server configuration settings.
|
||||||
*/
|
*/
|
||||||
public static final class Provider {
|
public static final class AuthorizationServer {
|
||||||
private static final String PROVIDER_SETTINGS_NAMESPACE = SETTINGS_NAMESPACE.concat("provider.");
|
private static final String AUTHORIZATION_SERVER_SETTINGS_NAMESPACE = SETTINGS_NAMESPACE.concat("authorization-server.");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the URL the Provider uses as its Issuer Identifier.
|
* Set the URL the Authorization Server uses as its Issuer Identifier.
|
||||||
*/
|
*/
|
||||||
public static final String ISSUER = PROVIDER_SETTINGS_NAMESPACE.concat("issuer");
|
public static final String ISSUER = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("issuer");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Provider's OAuth 2.0 Authorization endpoint.
|
* Set the OAuth 2.0 Authorization endpoint.
|
||||||
*/
|
*/
|
||||||
public static final String AUTHORIZATION_ENDPOINT = PROVIDER_SETTINGS_NAMESPACE.concat("authorization-endpoint");
|
public static final String AUTHORIZATION_ENDPOINT = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("authorization-endpoint");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Provider's OAuth 2.0 Token endpoint.
|
* Set the OAuth 2.0 Token endpoint.
|
||||||
*/
|
*/
|
||||||
public static final String TOKEN_ENDPOINT = PROVIDER_SETTINGS_NAMESPACE.concat("token-endpoint");
|
public static final String TOKEN_ENDPOINT = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("token-endpoint");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Provider's JWK Set endpoint.
|
* Set the JWK Set endpoint.
|
||||||
*/
|
*/
|
||||||
public static final String JWK_SET_ENDPOINT = PROVIDER_SETTINGS_NAMESPACE.concat("jwk-set-endpoint");
|
public static final String JWK_SET_ENDPOINT = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("jwk-set-endpoint");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Provider's OAuth 2.0 Token Revocation endpoint.
|
* Set the OAuth 2.0 Token Revocation endpoint.
|
||||||
*/
|
*/
|
||||||
public static final String TOKEN_REVOCATION_ENDPOINT = PROVIDER_SETTINGS_NAMESPACE.concat("token-revocation-endpoint");
|
public static final String TOKEN_REVOCATION_ENDPOINT = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("token-revocation-endpoint");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Provider's OAuth 2.0 Token Introspection endpoint.
|
* Set the OAuth 2.0 Token Introspection endpoint.
|
||||||
*/
|
*/
|
||||||
public static final String TOKEN_INTROSPECTION_ENDPOINT = PROVIDER_SETTINGS_NAMESPACE.concat("token-introspection-endpoint");
|
public static final String TOKEN_INTROSPECTION_ENDPOINT = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("token-introspection-endpoint");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Provider's OpenID Connect 1.0 Client Registration endpoint.
|
* Set the OpenID Connect 1.0 Client Registration endpoint.
|
||||||
*/
|
*/
|
||||||
public static final String OIDC_CLIENT_REGISTRATION_ENDPOINT = PROVIDER_SETTINGS_NAMESPACE.concat("oidc-client-registration-endpoint");
|
public static final String OIDC_CLIENT_REGISTRATION_ENDPOINT = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("oidc-client-registration-endpoint");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the Provider's OpenID Connect 1.0 UserInfo endpoint.
|
* Set the OpenID Connect 1.0 UserInfo endpoint.
|
||||||
*/
|
*/
|
||||||
public static final String OIDC_USER_INFO_ENDPOINT = PROVIDER_SETTINGS_NAMESPACE.concat("oidc-user-info-endpoint");
|
public static final String OIDC_USER_INFO_ENDPOINT = AUTHORIZATION_SERVER_SETTINGS_NAMESPACE.concat("oidc-user-info-endpoint");
|
||||||
|
|
||||||
private Provider() {
|
private AuthorizationServer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -82,8 +82,8 @@ public final class JwtGenerator implements OAuth2TokenGenerator<Jwt> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String issuer = null;
|
String issuer = null;
|
||||||
if (context.getProviderContext() != null) {
|
if (context.getAuthorizationServerContext() != null) {
|
||||||
issuer = context.getProviderContext().getIssuer();
|
issuer = context.getAuthorizationServerContext().getIssuer();
|
||||||
}
|
}
|
||||||
RegisteredClient registeredClient = context.getRegisteredClient();
|
RegisteredClient registeredClient = context.getRegisteredClient();
|
||||||
|
|
||||||
@@ -132,7 +132,7 @@ public final class JwtGenerator implements OAuth2TokenGenerator<Jwt> {
|
|||||||
JwtEncodingContext.Builder jwtContextBuilder = JwtEncodingContext.with(jwsHeaderBuilder, claimsBuilder)
|
JwtEncodingContext.Builder jwtContextBuilder = JwtEncodingContext.with(jwsHeaderBuilder, claimsBuilder)
|
||||||
.registeredClient(context.getRegisteredClient())
|
.registeredClient(context.getRegisteredClient())
|
||||||
.principal(context.getPrincipal())
|
.principal(context.getPrincipal())
|
||||||
.providerContext(context.getProviderContext())
|
.authorizationServerContext(context.getAuthorizationServerContext())
|
||||||
.authorizedScopes(context.getAuthorizedScopes())
|
.authorizedScopes(context.getAuthorizedScopes())
|
||||||
.tokenType(context.getTokenType())
|
.tokenType(context.getTokenType())
|
||||||
.authorizationGrantType(context.getAuthorizationGrantType());
|
.authorizationGrantType(context.getAuthorizationGrantType());
|
||||||
|
|||||||
@@ -61,8 +61,8 @@ public final class OAuth2AccessTokenGenerator implements OAuth2TokenGenerator<OA
|
|||||||
}
|
}
|
||||||
|
|
||||||
String issuer = null;
|
String issuer = null;
|
||||||
if (context.getProviderContext() != null) {
|
if (context.getAuthorizationServerContext() != null) {
|
||||||
issuer = context.getProviderContext().getIssuer();
|
issuer = context.getAuthorizationServerContext().getIssuer();
|
||||||
}
|
}
|
||||||
RegisteredClient registeredClient = context.getRegisteredClient();
|
RegisteredClient registeredClient = context.getRegisteredClient();
|
||||||
|
|
||||||
@@ -91,7 +91,7 @@ public final class OAuth2AccessTokenGenerator implements OAuth2TokenGenerator<OA
|
|||||||
OAuth2TokenClaimsContext.Builder accessTokenContextBuilder = OAuth2TokenClaimsContext.with(claimsBuilder)
|
OAuth2TokenClaimsContext.Builder accessTokenContextBuilder = OAuth2TokenClaimsContext.with(claimsBuilder)
|
||||||
.registeredClient(context.getRegisteredClient())
|
.registeredClient(context.getRegisteredClient())
|
||||||
.principal(context.getPrincipal())
|
.principal(context.getPrincipal())
|
||||||
.providerContext(context.getProviderContext())
|
.authorizationServerContext(context.getAuthorizationServerContext())
|
||||||
.authorizedScopes(context.getAuthorizedScopes())
|
.authorizedScopes(context.getAuthorizedScopes())
|
||||||
.tokenType(context.getTokenType())
|
.tokenType(context.getTokenType())
|
||||||
.authorizationGrantType(context.getAuthorizationGrantType());
|
.authorizationGrantType(context.getAuthorizationGrantType());
|
||||||
|
|||||||
@@ -27,8 +27,8 @@ import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
|
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.Context;
|
import org.springframework.security.oauth2.server.authorization.context.Context;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -63,13 +63,13 @@ public interface OAuth2TokenContext extends Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the {@link ProviderContext provider context}.
|
* Returns the {@link AuthorizationServerContext authorization server context}.
|
||||||
*
|
*
|
||||||
* @return the {@link ProviderContext}
|
* @return the {@link AuthorizationServerContext}
|
||||||
* @since 0.2.3
|
* @since 0.2.3
|
||||||
*/
|
*/
|
||||||
default ProviderContext getProviderContext() {
|
default AuthorizationServerContext getAuthorizationServerContext() {
|
||||||
return get(ProviderContext.class);
|
return get(AuthorizationServerContext.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -157,14 +157,14 @@ public interface OAuth2TokenContext extends Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the {@link ProviderContext provider context}.
|
* Sets the {@link AuthorizationServerContext authorization server context}.
|
||||||
*
|
*
|
||||||
* @param providerContext the {@link ProviderContext}
|
* @param authorizationServerContext the {@link AuthorizationServerContext}
|
||||||
* @return the {@link AbstractBuilder} for further configuration
|
* @return the {@link AbstractBuilder} for further configuration
|
||||||
* @since 0.2.3
|
* @since 0.2.3
|
||||||
*/
|
*/
|
||||||
public B providerContext(ProviderContext providerContext) {
|
public B authorizationServerContext(AuthorizationServerContext authorizationServerContext) {
|
||||||
return put(ProviderContext.class, providerContext);
|
return put(AuthorizationServerContext.class, authorizationServerContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
|||||||
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
|
import org.springframework.security.oauth2.core.ClientAuthenticationMethod;
|
||||||
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationServerMetadata;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.http.converter.OAuth2AuthorizationServerMetadataHttpMessageConverter;
|
import org.springframework.security.oauth2.server.authorization.http.converter.OAuth2AuthorizationServerMetadataHttpMessageConverter;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
import org.springframework.security.web.util.matcher.RequestMatcher;
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||||
import org.springframework.util.Assert;
|
|
||||||
import org.springframework.web.filter.OncePerRequestFilter;
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
import org.springframework.web.util.UriComponentsBuilder;
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
@@ -46,7 +46,7 @@ import org.springframework.web.util.UriComponentsBuilder;
|
|||||||
* @author Daniel Garnier-Moiroux
|
* @author Daniel Garnier-Moiroux
|
||||||
* @since 0.1.1
|
* @since 0.1.1
|
||||||
* @see OAuth2AuthorizationServerMetadata
|
* @see OAuth2AuthorizationServerMetadata
|
||||||
* @see ProviderSettings
|
* @see AuthorizationServerSettings
|
||||||
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc8414#section-3">3. Obtaining Authorization Server Metadata</a>
|
* @see <a target="_blank" href="https://tools.ietf.org/html/rfc8414#section-3">3. Obtaining Authorization Server Metadata</a>
|
||||||
*/
|
*/
|
||||||
public final class OAuth2AuthorizationServerMetadataEndpointFilter extends OncePerRequestFilter {
|
public final class OAuth2AuthorizationServerMetadataEndpointFilter extends OncePerRequestFilter {
|
||||||
@@ -55,20 +55,12 @@ public final class OAuth2AuthorizationServerMetadataEndpointFilter extends OnceP
|
|||||||
*/
|
*/
|
||||||
private static final String DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI = "/.well-known/oauth-authorization-server";
|
private static final String DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI = "/.well-known/oauth-authorization-server";
|
||||||
|
|
||||||
private final ProviderSettings providerSettings;
|
private final RequestMatcher requestMatcher = new AntPathRequestMatcher(
|
||||||
private final RequestMatcher requestMatcher;
|
DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI,
|
||||||
|
HttpMethod.GET.name());
|
||||||
private final OAuth2AuthorizationServerMetadataHttpMessageConverter authorizationServerMetadataHttpMessageConverter =
|
private final OAuth2AuthorizationServerMetadataHttpMessageConverter authorizationServerMetadataHttpMessageConverter =
|
||||||
new OAuth2AuthorizationServerMetadataHttpMessageConverter();
|
new OAuth2AuthorizationServerMetadataHttpMessageConverter();
|
||||||
|
|
||||||
public OAuth2AuthorizationServerMetadataEndpointFilter(ProviderSettings providerSettings) {
|
|
||||||
Assert.notNull(providerSettings, "providerSettings cannot be null");
|
|
||||||
this.providerSettings = providerSettings;
|
|
||||||
this.requestMatcher = new AntPathRequestMatcher(
|
|
||||||
DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI,
|
|
||||||
HttpMethod.GET.name()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
||||||
throws ServletException, IOException {
|
throws ServletException, IOException {
|
||||||
@@ -78,21 +70,23 @@ public final class OAuth2AuthorizationServerMetadataEndpointFilter extends OnceP
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
String issuer = ProviderContextHolder.getProviderContext().getIssuer();
|
AuthorizationServerContext authorizationServerContext = AuthorizationServerContextHolder.getContext();
|
||||||
|
String issuer = authorizationServerContext.getIssuer();
|
||||||
|
AuthorizationServerSettings authorizationServerSettings = authorizationServerContext.getAuthorizationServerSettings();
|
||||||
|
|
||||||
OAuth2AuthorizationServerMetadata authorizationServerMetadata = OAuth2AuthorizationServerMetadata.builder()
|
OAuth2AuthorizationServerMetadata authorizationServerMetadata = OAuth2AuthorizationServerMetadata.builder()
|
||||||
.issuer(issuer)
|
.issuer(issuer)
|
||||||
.authorizationEndpoint(asUrl(issuer, this.providerSettings.getAuthorizationEndpoint()))
|
.authorizationEndpoint(asUrl(issuer, authorizationServerSettings.getAuthorizationEndpoint()))
|
||||||
.tokenEndpoint(asUrl(issuer, this.providerSettings.getTokenEndpoint()))
|
.tokenEndpoint(asUrl(issuer, authorizationServerSettings.getTokenEndpoint()))
|
||||||
.tokenEndpointAuthenticationMethods(clientAuthenticationMethods())
|
.tokenEndpointAuthenticationMethods(clientAuthenticationMethods())
|
||||||
.jwkSetUrl(asUrl(issuer, this.providerSettings.getJwkSetEndpoint()))
|
.jwkSetUrl(asUrl(issuer, authorizationServerSettings.getJwkSetEndpoint()))
|
||||||
.responseType(OAuth2AuthorizationResponseType.CODE.getValue())
|
.responseType(OAuth2AuthorizationResponseType.CODE.getValue())
|
||||||
.grantType(AuthorizationGrantType.AUTHORIZATION_CODE.getValue())
|
.grantType(AuthorizationGrantType.AUTHORIZATION_CODE.getValue())
|
||||||
.grantType(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue())
|
.grantType(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue())
|
||||||
.grantType(AuthorizationGrantType.REFRESH_TOKEN.getValue())
|
.grantType(AuthorizationGrantType.REFRESH_TOKEN.getValue())
|
||||||
.tokenRevocationEndpoint(asUrl(issuer, this.providerSettings.getTokenRevocationEndpoint()))
|
.tokenRevocationEndpoint(asUrl(issuer, authorizationServerSettings.getTokenRevocationEndpoint()))
|
||||||
.tokenRevocationEndpointAuthenticationMethods(clientAuthenticationMethods())
|
.tokenRevocationEndpointAuthenticationMethods(clientAuthenticationMethods())
|
||||||
.tokenIntrospectionEndpoint(asUrl(issuer, this.providerSettings.getTokenIntrospectionEndpoint()))
|
.tokenIntrospectionEndpoint(asUrl(issuer, authorizationServerSettings.getTokenIntrospectionEndpoint()))
|
||||||
.tokenIntrospectionEndpointAuthenticationMethods(clientAuthenticationMethods())
|
.tokenIntrospectionEndpointAuthenticationMethods(clientAuthenticationMethods())
|
||||||
.codeChallengeMethod("S256")
|
.codeChallengeMethod("S256")
|
||||||
.build();
|
.build();
|
||||||
|
|||||||
@@ -1,86 +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.web;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import jakarta.servlet.FilterChain;
|
|
||||||
import jakarta.servlet.ServletException;
|
|
||||||
import jakarta.servlet.http.HttpServletRequest;
|
|
||||||
import jakarta.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.web.util.UrlUtils;
|
|
||||||
import org.springframework.util.Assert;
|
|
||||||
import org.springframework.web.filter.OncePerRequestFilter;
|
|
||||||
import org.springframework.web.util.UriComponentsBuilder;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A {@code Filter} that associates the {@link ProviderContext} to the {@link ProviderContextHolder}.
|
|
||||||
*
|
|
||||||
* @author Joe Grandja
|
|
||||||
* @since 0.2.2
|
|
||||||
* @see ProviderContext
|
|
||||||
* @see ProviderContextHolder
|
|
||||||
* @see ProviderSettings
|
|
||||||
*/
|
|
||||||
public final class ProviderContextFilter extends OncePerRequestFilter {
|
|
||||||
private final ProviderSettings providerSettings;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Constructs a {@code ProviderContextFilter} using the provided parameters.
|
|
||||||
*
|
|
||||||
* @param providerSettings the provider settings
|
|
||||||
*/
|
|
||||||
public ProviderContextFilter(ProviderSettings providerSettings) {
|
|
||||||
Assert.notNull(providerSettings, "providerSettings cannot be null");
|
|
||||||
this.providerSettings = providerSettings;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
|
|
||||||
throws ServletException, IOException {
|
|
||||||
|
|
||||||
try {
|
|
||||||
ProviderContext providerContext = new ProviderContext(
|
|
||||||
this.providerSettings, () -> resolveIssuer(this.providerSettings, request));
|
|
||||||
ProviderContextHolder.setProviderContext(providerContext);
|
|
||||||
filterChain.doFilter(request, response);
|
|
||||||
} finally {
|
|
||||||
ProviderContextHolder.resetProviderContext();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String resolveIssuer(ProviderSettings providerSettings, HttpServletRequest request) {
|
|
||||||
return providerSettings.getIssuer() != null ?
|
|
||||||
providerSettings.getIssuer() :
|
|
||||||
getContextPath(request);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getContextPath(HttpServletRequest request) {
|
|
||||||
// @formatter:off
|
|
||||||
return UriComponentsBuilder.fromHttpUrl(UrlUtils.buildFullRequestUrl(request))
|
|
||||||
.replacePath(request.getContextPath())
|
|
||||||
.replaceQuery(null)
|
|
||||||
.fragment(null)
|
|
||||||
.build()
|
|
||||||
.toUriString();
|
|
||||||
// @formatter:on
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -57,10 +57,10 @@ import org.springframework.security.oauth2.server.authorization.TestOAuth2Author
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.web.util.UriComponentsBuilder;
|
import org.springframework.web.util.UriComponentsBuilder;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
@@ -91,7 +91,7 @@ public class JwtClientAssertionAuthenticationProviderTests {
|
|||||||
private RegisteredClientRepository registeredClientRepository;
|
private RegisteredClientRepository registeredClientRepository;
|
||||||
private OAuth2AuthorizationService authorizationService;
|
private OAuth2AuthorizationService authorizationService;
|
||||||
private JwtClientAssertionAuthenticationProvider authenticationProvider;
|
private JwtClientAssertionAuthenticationProvider authenticationProvider;
|
||||||
private ProviderSettings providerSettings;
|
private AuthorizationServerSettings authorizationServerSettings;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -99,8 +99,8 @@ public class JwtClientAssertionAuthenticationProviderTests {
|
|||||||
this.authorizationService = mock(OAuth2AuthorizationService.class);
|
this.authorizationService = mock(OAuth2AuthorizationService.class);
|
||||||
this.authenticationProvider = new JwtClientAssertionAuthenticationProvider(
|
this.authenticationProvider = new JwtClientAssertionAuthenticationProvider(
|
||||||
this.registeredClientRepository, this.authorizationService);
|
this.registeredClientRepository, this.authorizationService);
|
||||||
this.providerSettings = ProviderSettings.builder().issuer("https://auth-server.com").build();
|
this.authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://auth-server.com").build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(this.providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(this.authorizationServerSettings, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -421,7 +421,7 @@ public class JwtClientAssertionAuthenticationProviderTests {
|
|||||||
return JwtClaimsSet.builder()
|
return JwtClaimsSet.builder()
|
||||||
.issuer(registeredClient.getClientId())
|
.issuer(registeredClient.getClientId())
|
||||||
.subject(registeredClient.getClientId())
|
.subject(registeredClient.getClientId())
|
||||||
.audience(Collections.singletonList(asUrl(this.providerSettings.getIssuer(), this.providerSettings.getTokenEndpoint())))
|
.audience(Collections.singletonList(asUrl(this.authorizationServerSettings.getIssuer(), this.authorizationServerSettings.getTokenEndpoint())))
|
||||||
.issuedAt(issuedAt)
|
.issuedAt(issuedAt)
|
||||||
.expiresAt(expiresAt);
|
.expiresAt(expiresAt);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,10 +54,10 @@ import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
|||||||
import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations;
|
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.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
@@ -118,13 +118,13 @@ public class OAuth2AuthorizationCodeAuthenticationProviderTests {
|
|||||||
});
|
});
|
||||||
this.authenticationProvider = new OAuth2AuthorizationCodeAuthenticationProvider(
|
this.authenticationProvider = new OAuth2AuthorizationCodeAuthenticationProvider(
|
||||||
this.authorizationService, this.tokenGenerator);
|
this.authorizationService, this.tokenGenerator);
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer("https://provider.com").build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
ProviderContextHolder.resetProviderContext();
|
AuthorizationServerContextHolder.resetContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -48,10 +48,10 @@ import org.springframework.security.oauth2.server.authorization.TestOAuth2Author
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
@@ -87,8 +87,8 @@ public class OAuth2AuthorizationCodeRequestAuthenticationProviderTests {
|
|||||||
this.registeredClientRepository, this.authorizationService, this.authorizationConsentService);
|
this.registeredClientRepository, this.authorizationService, this.authorizationConsentService);
|
||||||
this.principal = new TestingAuthenticationToken("principalName", "password");
|
this.principal = new TestingAuthenticationToken("principalName", "password");
|
||||||
this.principal.setAuthenticated(true);
|
this.principal.setAuthenticated(true);
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer("https://provider.com").build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -42,10 +42,10 @@ import org.springframework.security.oauth2.server.authorization.OAuth2Authorizat
|
|||||||
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
@@ -99,13 +99,13 @@ public class OAuth2ClientCredentialsAuthenticationProviderTests {
|
|||||||
});
|
});
|
||||||
this.authenticationProvider = new OAuth2ClientCredentialsAuthenticationProvider(
|
this.authenticationProvider = new OAuth2ClientCredentialsAuthenticationProvider(
|
||||||
this.authorizationService, this.tokenGenerator);
|
this.authorizationService, this.tokenGenerator);
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer("https://provider.com").build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
ProviderContextHolder.resetProviderContext();
|
AuthorizationServerContextHolder.resetContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -51,10 +51,10 @@ import org.springframework.security.oauth2.server.authorization.OAuth2TokenType;
|
|||||||
import org.springframework.security.oauth2.server.authorization.TestOAuth2Authorizations;
|
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.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
@@ -116,13 +116,13 @@ public class OAuth2RefreshTokenAuthenticationProviderTests {
|
|||||||
});
|
});
|
||||||
this.authenticationProvider = new OAuth2RefreshTokenAuthenticationProvider(
|
this.authenticationProvider = new OAuth2RefreshTokenAuthenticationProvider(
|
||||||
this.authorizationService, this.tokenGenerator);
|
this.authorizationService, this.tokenGenerator);
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer("https://provider.com").build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
ProviderContextHolder.resetProviderContext();
|
AuthorizationServerContextHolder.resetContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
@@ -42,7 +42,7 @@ import org.springframework.security.oauth2.server.authorization.client.JdbcRegis
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
||||||
import org.springframework.test.web.servlet.MockMvc;
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
|
||||||
@@ -61,7 +61,7 @@ public class JwkSetTests {
|
|||||||
private static final String DEFAULT_JWK_SET_ENDPOINT_URI = "/oauth2/jwks";
|
private static final String DEFAULT_JWK_SET_ENDPOINT_URI = "/oauth2/jwks";
|
||||||
private static EmbeddedDatabase db;
|
private static EmbeddedDatabase db;
|
||||||
private static JWKSource<SecurityContext> jwkSource;
|
private static JWKSource<SecurityContext> jwkSource;
|
||||||
private static ProviderSettings providerSettings;
|
private static AuthorizationServerSettings authorizationServerSettings;
|
||||||
|
|
||||||
@Rule
|
@Rule
|
||||||
public final SpringTestRule spring = new SpringTestRule();
|
public final SpringTestRule spring = new SpringTestRule();
|
||||||
@@ -76,7 +76,7 @@ public class JwkSetTests {
|
|||||||
public static void init() {
|
public static void init() {
|
||||||
JWKSet jwkSet = new JWKSet(TestJwks.DEFAULT_RSA_JWK);
|
JWKSet jwkSet = new JWKSet(TestJwks.DEFAULT_RSA_JWK);
|
||||||
jwkSource = (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
|
jwkSource = (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
|
||||||
providerSettings = ProviderSettings.builder().jwkSetEndpoint("/test/jwks").build();
|
authorizationServerSettings = AuthorizationServerSettings.builder().jwkSetEndpoint("/test/jwks").build();
|
||||||
db = new EmbeddedDatabaseBuilder()
|
db = new EmbeddedDatabaseBuilder()
|
||||||
.generateUniqueName(true)
|
.generateUniqueName(true)
|
||||||
.setType(EmbeddedDatabaseType.HSQL)
|
.setType(EmbeddedDatabaseType.HSQL)
|
||||||
@@ -108,7 +108,7 @@ public class JwkSetTests {
|
|||||||
public void requestWhenJwkSetCustomEndpointThenReturnKeys() throws Exception {
|
public void requestWhenJwkSetCustomEndpointThenReturnKeys() throws Exception {
|
||||||
this.spring.register(AuthorizationServerConfigurationCustomEndpoints.class).autowire();
|
this.spring.register(AuthorizationServerConfigurationCustomEndpoints.class).autowire();
|
||||||
|
|
||||||
assertJwkSetRequestThenReturnKeys(providerSettings.getJwkSetEndpoint());
|
assertJwkSetRequestThenReturnKeys(authorizationServerSettings.getJwkSetEndpoint());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertJwkSetRequestThenReturnKeys(String jwkSetEndpointUri) throws Exception {
|
private void assertJwkSetRequestThenReturnKeys(String jwkSetEndpointUri) throws Exception {
|
||||||
@@ -171,8 +171,8 @@ public class JwkSetTests {
|
|||||||
static class AuthorizationServerConfigurationCustomEndpoints extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationCustomEndpoints extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return providerSettings;
|
return authorizationServerSettings;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -97,8 +97,8 @@ import org.springframework.security.oauth2.server.authorization.client.Registere
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
@@ -161,7 +161,7 @@ public class OAuth2AuthorizationCodeGrantTests {
|
|||||||
private static EmbeddedDatabase db;
|
private static EmbeddedDatabase db;
|
||||||
private static JWKSource<SecurityContext> jwkSource;
|
private static JWKSource<SecurityContext> jwkSource;
|
||||||
private static NimbusJwtEncoder jwtEncoder;
|
private static NimbusJwtEncoder jwtEncoder;
|
||||||
private static ProviderSettings providerSettings;
|
private static AuthorizationServerSettings authorizationServerSettings;
|
||||||
private static HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter =
|
private static HttpMessageConverter<OAuth2AccessTokenResponse> accessTokenHttpResponseConverter =
|
||||||
new OAuth2AccessTokenResponseHttpMessageConverter();
|
new OAuth2AccessTokenResponseHttpMessageConverter();
|
||||||
private static AuthenticationConverter authorizationRequestConverter;
|
private static AuthenticationConverter authorizationRequestConverter;
|
||||||
@@ -197,7 +197,7 @@ public class OAuth2AuthorizationCodeGrantTests {
|
|||||||
JWKSet jwkSet = new JWKSet(TestJwks.DEFAULT_RSA_JWK);
|
JWKSet jwkSet = new JWKSet(TestJwks.DEFAULT_RSA_JWK);
|
||||||
jwkSource = (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
|
jwkSource = (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
|
||||||
jwtEncoder = new NimbusJwtEncoder(jwkSource);
|
jwtEncoder = new NimbusJwtEncoder(jwkSource);
|
||||||
providerSettings = ProviderSettings.builder()
|
authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
.authorizationEndpoint("/test/authorize")
|
.authorizationEndpoint("/test/authorize")
|
||||||
.tokenEndpoint("/test/token")
|
.tokenEndpoint("/test/token")
|
||||||
.build();
|
.build();
|
||||||
@@ -269,7 +269,7 @@ public class OAuth2AuthorizationCodeGrantTests {
|
|||||||
public void requestWhenAuthorizationRequestCustomEndpointThenRedirectToClient() throws Exception {
|
public void requestWhenAuthorizationRequestCustomEndpointThenRedirectToClient() throws Exception {
|
||||||
this.spring.register(AuthorizationServerConfigurationCustomEndpoints.class).autowire();
|
this.spring.register(AuthorizationServerConfigurationCustomEndpoints.class).autowire();
|
||||||
|
|
||||||
assertAuthorizationRequestRedirectsToClient(providerSettings.getAuthorizationEndpoint());
|
assertAuthorizationRequestRedirectsToClient(authorizationServerSettings.getAuthorizationEndpoint());
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertAuthorizationRequestRedirectsToClient(String authorizationEndpointUri) throws Exception {
|
private void assertAuthorizationRequestRedirectsToClient(String authorizationEndpointUri) throws Exception {
|
||||||
@@ -326,7 +326,7 @@ public class OAuth2AuthorizationCodeGrantTests {
|
|||||||
this.authorizationService.save(authorization);
|
this.authorizationService.save(authorization);
|
||||||
|
|
||||||
assertTokenRequestReturnsAccessTokenResponse(
|
assertTokenRequestReturnsAccessTokenResponse(
|
||||||
registeredClient, authorization, providerSettings.getTokenEndpoint());
|
registeredClient, authorization, authorizationServerSettings.getTokenEndpoint());
|
||||||
}
|
}
|
||||||
|
|
||||||
private OAuth2AccessTokenResponse assertTokenRequestReturnsAccessTokenResponse(RegisteredClient registeredClient,
|
private OAuth2AccessTokenResponse assertTokenRequestReturnsAccessTokenResponse(RegisteredClient registeredClient,
|
||||||
@@ -863,8 +863,8 @@ public class OAuth2AuthorizationCodeGrantTests {
|
|||||||
static class AuthorizationServerConfigurationCustomEndpoints extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationCustomEndpoints extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return providerSettings;
|
return authorizationServerSettings;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -39,7 +39,7 @@ import org.springframework.security.oauth2.server.authorization.client.Registere
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
||||||
import org.springframework.test.web.servlet.MockMvc;
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
|
|
||||||
@@ -92,7 +92,7 @@ public class OAuth2AuthorizationServerMetadataTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void requestWhenAuthorizationServerMetadataRequestAndIssuerSetThenReturnMetadataResponse() throws Exception {
|
public void requestWhenAuthorizationServerMetadataRequestAndIssuerSetThenUsed() throws Exception {
|
||||||
this.spring.register(AuthorizationServerConfiguration.class).autowire();
|
this.spring.register(AuthorizationServerConfiguration.class).autowire();
|
||||||
|
|
||||||
this.mvc.perform(get(DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI))
|
this.mvc.perform(get(DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI))
|
||||||
@@ -101,6 +101,16 @@ public class OAuth2AuthorizationServerMetadataTests {
|
|||||||
.andReturn();
|
.andReturn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void requestWhenAuthorizationServerMetadataRequestAndIssuerNotSetThenResolveFromRequest() throws Exception {
|
||||||
|
this.spring.register(AuthorizationServerConfigurationWithIssuerNotSet.class).autowire();
|
||||||
|
|
||||||
|
this.mvc.perform(get(DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI))
|
||||||
|
.andExpect(status().is2xxSuccessful())
|
||||||
|
.andExpect(jsonPath("issuer").value("http://localhost"))
|
||||||
|
.andReturn();
|
||||||
|
}
|
||||||
|
|
||||||
@EnableWebSecurity
|
@EnableWebSecurity
|
||||||
@Import(OAuth2AuthorizationServerConfiguration.class)
|
@Import(OAuth2AuthorizationServerConfiguration.class)
|
||||||
static class AuthorizationServerConfiguration {
|
static class AuthorizationServerConfiguration {
|
||||||
@@ -124,8 +134,18 @@ public class OAuth2AuthorizationServerMetadataTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer(issuerUrl).build();
|
return AuthorizationServerSettings.builder().issuer(issuerUrl).build();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@EnableWebSecurity
|
||||||
|
@Import(OAuth2AuthorizationServerConfiguration.class)
|
||||||
|
static class AuthorizationServerConfigurationWithIssuerNotSet extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
|
return AuthorizationServerSettings.builder().build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -81,8 +81,8 @@ import org.springframework.security.oauth2.server.authorization.client.TestRegis
|
|||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.http.converter.OAuth2TokenIntrospectionHttpMessageConverter;
|
import org.springframework.security.oauth2.server.authorization.http.converter.OAuth2TokenIntrospectionHttpMessageConverter;
|
||||||
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsContext;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenClaimsContext;
|
||||||
@@ -115,7 +115,7 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.
|
|||||||
*/
|
*/
|
||||||
public class OAuth2TokenIntrospectionTests {
|
public class OAuth2TokenIntrospectionTests {
|
||||||
private static EmbeddedDatabase db;
|
private static EmbeddedDatabase db;
|
||||||
private static ProviderSettings providerSettings;
|
private static AuthorizationServerSettings authorizationServerSettings;
|
||||||
private static OAuth2TokenCustomizer<OAuth2TokenClaimsContext> accessTokenCustomizer;
|
private static OAuth2TokenCustomizer<OAuth2TokenClaimsContext> accessTokenCustomizer;
|
||||||
private static AuthenticationConverter authenticationConverter;
|
private static AuthenticationConverter authenticationConverter;
|
||||||
private static AuthenticationProvider authenticationProvider;
|
private static AuthenticationProvider authenticationProvider;
|
||||||
@@ -143,7 +143,7 @@ public class OAuth2TokenIntrospectionTests {
|
|||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void init() {
|
public static void init() {
|
||||||
providerSettings = ProviderSettings.builder().tokenIntrospectionEndpoint("/test/introspect").build();
|
authorizationServerSettings = AuthorizationServerSettings.builder().tokenIntrospectionEndpoint("/test/introspect").build();
|
||||||
authenticationConverter = mock(AuthenticationConverter.class);
|
authenticationConverter = mock(AuthenticationConverter.class);
|
||||||
authenticationProvider = mock(AuthenticationProvider.class);
|
authenticationProvider = mock(AuthenticationProvider.class);
|
||||||
authenticationSuccessHandler = mock(AuthenticationSuccessHandler.class);
|
authenticationSuccessHandler = mock(AuthenticationSuccessHandler.class);
|
||||||
@@ -202,7 +202,7 @@ public class OAuth2TokenIntrospectionTests {
|
|||||||
this.authorizationService.save(authorization);
|
this.authorizationService.save(authorization);
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
MvcResult mvcResult = this.mvc.perform(post(providerSettings.getTokenIntrospectionEndpoint())
|
MvcResult mvcResult = this.mvc.perform(post(authorizationServerSettings.getTokenIntrospectionEndpoint())
|
||||||
.params(getTokenIntrospectionRequestParameters(accessToken, OAuth2TokenType.ACCESS_TOKEN))
|
.params(getTokenIntrospectionRequestParameters(accessToken, OAuth2TokenType.ACCESS_TOKEN))
|
||||||
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
||||||
.andExpect(status().isOk())
|
.andExpect(status().isOk())
|
||||||
@@ -242,7 +242,7 @@ public class OAuth2TokenIntrospectionTests {
|
|||||||
this.authorizationService.save(authorization);
|
this.authorizationService.save(authorization);
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
MvcResult mvcResult = this.mvc.perform(post(providerSettings.getTokenIntrospectionEndpoint())
|
MvcResult mvcResult = this.mvc.perform(post(authorizationServerSettings.getTokenIntrospectionEndpoint())
|
||||||
.params(getTokenIntrospectionRequestParameters(refreshToken, OAuth2TokenType.REFRESH_TOKEN))
|
.params(getTokenIntrospectionRequestParameters(refreshToken, OAuth2TokenType.REFRESH_TOKEN))
|
||||||
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
||||||
.andExpect(status().isOk())
|
.andExpect(status().isOk())
|
||||||
@@ -284,7 +284,7 @@ public class OAuth2TokenIntrospectionTests {
|
|||||||
this.authorizationService.save(authorization);
|
this.authorizationService.save(authorization);
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
MvcResult mvcResult = this.mvc.perform(post(providerSettings.getTokenEndpoint())
|
MvcResult mvcResult = this.mvc.perform(post(authorizationServerSettings.getTokenEndpoint())
|
||||||
.params(getAuthorizationCodeTokenRequestParameters(authorizedRegisteredClient, authorization))
|
.params(getAuthorizationCodeTokenRequestParameters(authorizedRegisteredClient, authorization))
|
||||||
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(authorizedRegisteredClient)))
|
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(authorizedRegisteredClient)))
|
||||||
.andExpect(status().isOk())
|
.andExpect(status().isOk())
|
||||||
@@ -298,7 +298,7 @@ public class OAuth2TokenIntrospectionTests {
|
|||||||
this.registeredClientRepository.save(introspectRegisteredClient);
|
this.registeredClientRepository.save(introspectRegisteredClient);
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
mvcResult = this.mvc.perform(post(providerSettings.getTokenIntrospectionEndpoint())
|
mvcResult = this.mvc.perform(post(authorizationServerSettings.getTokenIntrospectionEndpoint())
|
||||||
.params(getTokenIntrospectionRequestParameters(accessToken, OAuth2TokenType.ACCESS_TOKEN))
|
.params(getTokenIntrospectionRequestParameters(accessToken, OAuth2TokenType.ACCESS_TOKEN))
|
||||||
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
||||||
.andExpect(status().isOk())
|
.andExpect(status().isOk())
|
||||||
@@ -357,7 +357,7 @@ public class OAuth2TokenIntrospectionTests {
|
|||||||
when(authenticationProvider.authenticate(any())).thenReturn(tokenIntrospectionAuthentication);
|
when(authenticationProvider.authenticate(any())).thenReturn(tokenIntrospectionAuthentication);
|
||||||
|
|
||||||
// @formatter:off
|
// @formatter:off
|
||||||
this.mvc.perform(post(providerSettings.getTokenIntrospectionEndpoint())
|
this.mvc.perform(post(authorizationServerSettings.getTokenIntrospectionEndpoint())
|
||||||
.params(getTokenIntrospectionRequestParameters(accessToken, OAuth2TokenType.ACCESS_TOKEN))
|
.params(getTokenIntrospectionRequestParameters(accessToken, OAuth2TokenType.ACCESS_TOKEN))
|
||||||
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
.header(HttpHeaders.AUTHORIZATION, getAuthorizationHeader(introspectRegisteredClient)))
|
||||||
.andExpect(status().isOk());
|
.andExpect(status().isOk());
|
||||||
@@ -440,8 +440,8 @@ public class OAuth2TokenIntrospectionTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return providerSettings;
|
return authorizationServerSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|||||||
@@ -77,8 +77,8 @@ import org.springframework.security.oauth2.server.authorization.client.TestRegis
|
|||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration;
|
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.http.converter.OidcClientRegistrationHttpMessageConverter;
|
import org.springframework.security.oauth2.server.authorization.oidc.http.converter.OidcClientRegistrationHttpMessageConverter;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
import org.springframework.security.web.util.matcher.RequestMatcher;
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||||
@@ -125,7 +125,7 @@ public class OidcClientRegistrationTests {
|
|||||||
private RegisteredClientRepository registeredClientRepository;
|
private RegisteredClientRepository registeredClientRepository;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ProviderSettings providerSettings;
|
private AuthorizationServerSettings authorizationServerSettings;
|
||||||
|
|
||||||
private MockWebServer server;
|
private MockWebServer server;
|
||||||
private String clientJwkSetUrl;
|
private String clientJwkSetUrl;
|
||||||
@@ -325,7 +325,7 @@ public class OidcClientRegistrationTests {
|
|||||||
return JwtClaimsSet.builder()
|
return JwtClaimsSet.builder()
|
||||||
.issuer(registeredClient.getClientId())
|
.issuer(registeredClient.getClientId())
|
||||||
.subject(registeredClient.getClientId())
|
.subject(registeredClient.getClientId())
|
||||||
.audience(Collections.singletonList(asUrl(this.providerSettings.getIssuer(), this.providerSettings.getTokenEndpoint())))
|
.audience(Collections.singletonList(asUrl(this.authorizationServerSettings.getIssuer(), this.authorizationServerSettings.getTokenEndpoint())))
|
||||||
.issuedAt(issuedAt)
|
.issuedAt(issuedAt)
|
||||||
.expiresAt(expiresAt);
|
.expiresAt(expiresAt);
|
||||||
}
|
}
|
||||||
@@ -408,8 +408,8 @@ public class OidcClientRegistrationTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder()
|
return AuthorizationServerSettings.builder()
|
||||||
.issuer("https://auth-server:9000")
|
.issuer("https://auth-server:9000")
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,7 +80,7 @@ import org.springframework.security.oauth2.server.authorization.client.Registere
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
import org.springframework.security.oauth2.server.authorization.jackson2.TestingAuthenticationTokenMixin;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.DelegatingOAuth2TokenGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
@@ -471,8 +471,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithIssuer extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithIssuer extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer(ISSUER_URL).build();
|
return AuthorizationServerSettings.builder().issuer(ISSUER_URL).build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -481,8 +481,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithInvalidIssuerUrl extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithInvalidIssuerUrl extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer("urn:example").build();
|
return AuthorizationServerSettings.builder().issuer("urn:example").build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -491,8 +491,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithInvalidIssuerUri extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithInvalidIssuerUri extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer("https://not a valid uri").build();
|
return AuthorizationServerSettings.builder().issuer("https://not a valid uri").build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -501,8 +501,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithIssuerQuery extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithIssuerQuery extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer(ISSUER_URL + "?param=value").build();
|
return AuthorizationServerSettings.builder().issuer(ISSUER_URL + "?param=value").build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -511,8 +511,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithIssuerFragment extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithIssuerFragment extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer(ISSUER_URL + "#fragment").build();
|
return AuthorizationServerSettings.builder().issuer(ISSUER_URL + "#fragment").build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -521,8 +521,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithIssuerQueryAndFragment extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithIssuerQueryAndFragment extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer(ISSUER_URL + "?param=value#fragment").build();
|
return AuthorizationServerSettings.builder().issuer(ISSUER_URL + "?param=value#fragment").build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -531,8 +531,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithIssuerEmptyQuery extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithIssuerEmptyQuery extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer(ISSUER_URL + "?").build();
|
return AuthorizationServerSettings.builder().issuer(ISSUER_URL + "?").build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -541,8 +541,8 @@ public class OidcTests {
|
|||||||
static class AuthorizationServerConfigurationWithIssuerEmptyFragment extends AuthorizationServerConfiguration {
|
static class AuthorizationServerConfigurationWithIssuerEmptyFragment extends AuthorizationServerConfiguration {
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer(ISSUER_URL + "#").build();
|
return AuthorizationServerSettings.builder().issuer(ISSUER_URL + "#").build();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ import org.springframework.security.oauth2.server.authorization.client.TestRegis
|
|||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationContext;
|
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.oidc.authentication.OidcUserInfoAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
import org.springframework.security.oauth2.server.authorization.test.SpringTestRule;
|
||||||
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
@@ -377,8 +377,8 @@ public class OidcUserInfoTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
ProviderSettings providerSettings() {
|
AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder()
|
return AuthorizationServerSettings.builder()
|
||||||
.issuer("https://auth-server:9000")
|
.issuer("https://auth-server:9000")
|
||||||
.build();
|
.build();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,47 @@
|
|||||||
|
/*
|
||||||
|
* 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.context;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
import org.springframework.lang.Nullable;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Joe Grandja
|
||||||
|
*/
|
||||||
|
public class TestAuthorizationServerContext implements AuthorizationServerContext {
|
||||||
|
private final AuthorizationServerSettings authorizationServerSettings;
|
||||||
|
private final Supplier<String> issuerSupplier;
|
||||||
|
|
||||||
|
public TestAuthorizationServerContext(AuthorizationServerSettings authorizationServerSettings, @Nullable Supplier<String> issuerSupplier) {
|
||||||
|
this.authorizationServerSettings = authorizationServerSettings;
|
||||||
|
this.issuerSupplier = issuerSupplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getIssuer() {
|
||||||
|
return this.issuerSupplier != null ?
|
||||||
|
this.issuerSupplier.get() :
|
||||||
|
getAuthorizationServerSettings().getIssuer();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public AuthorizationServerSettings getAuthorizationServerSettings() {
|
||||||
|
return this.authorizationServerSettings;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -52,12 +52,13 @@ import org.springframework.security.oauth2.server.authorization.TestOAuth2Author
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientMetadataClaimNames;
|
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientMetadataClaimNames;
|
||||||
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration;
|
import org.springframework.security.oauth2.server.authorization.oidc.OidcClientRegistration;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.JwtGenerator;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenGenerator;
|
||||||
@@ -88,7 +89,7 @@ public class OidcClientRegistrationAuthenticationProviderTests {
|
|||||||
private OAuth2AuthorizationService authorizationService;
|
private OAuth2AuthorizationService authorizationService;
|
||||||
private JwtEncoder jwtEncoder;
|
private JwtEncoder jwtEncoder;
|
||||||
private OAuth2TokenGenerator<?> tokenGenerator;
|
private OAuth2TokenGenerator<?> tokenGenerator;
|
||||||
private ProviderSettings providerSettings;
|
private AuthorizationServerSettings authorizationServerSettings;
|
||||||
private OidcClientRegistrationAuthenticationProvider authenticationProvider;
|
private OidcClientRegistrationAuthenticationProvider authenticationProvider;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
@@ -103,15 +104,15 @@ public class OidcClientRegistrationAuthenticationProviderTests {
|
|||||||
return jwtGenerator.generate(context);
|
return jwtGenerator.generate(context);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.providerSettings = ProviderSettings.builder().issuer("https://provider.com").build();
|
this.authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(this.providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(this.authorizationServerSettings, null));
|
||||||
this.authenticationProvider = new OidcClientRegistrationAuthenticationProvider(
|
this.authenticationProvider = new OidcClientRegistrationAuthenticationProvider(
|
||||||
this.registeredClientRepository, this.authorizationService, this.tokenGenerator);
|
this.registeredClientRepository, this.authorizationService, this.tokenGenerator);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
ProviderContextHolder.resetProviderContext();
|
AuthorizationServerContextHolder.resetContext();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -612,9 +613,9 @@ public class OidcClientRegistrationAuthenticationProviderTests {
|
|||||||
assertThat(clientRegistrationResult.getIdTokenSignedResponseAlgorithm())
|
assertThat(clientRegistrationResult.getIdTokenSignedResponseAlgorithm())
|
||||||
.isEqualTo(registeredClientResult.getTokenSettings().getIdTokenSignatureAlgorithm().getName());
|
.isEqualTo(registeredClientResult.getTokenSettings().getIdTokenSignatureAlgorithm().getName());
|
||||||
|
|
||||||
ProviderContext providerContext = ProviderContextHolder.getProviderContext();
|
AuthorizationServerContext authorizationServerContext = AuthorizationServerContextHolder.getContext();
|
||||||
String expectedRegistrationClientUrl = UriComponentsBuilder.fromUriString(providerContext.getIssuer())
|
String expectedRegistrationClientUrl = UriComponentsBuilder.fromUriString(authorizationServerContext.getIssuer())
|
||||||
.path(providerContext.getProviderSettings().getOidcClientRegistrationEndpoint())
|
.path(authorizationServerContext.getAuthorizationServerSettings().getOidcClientRegistrationEndpoint())
|
||||||
.queryParam(OAuth2ParameterNames.CLIENT_ID, registeredClientResult.getClientId()).toUriString();
|
.queryParam(OAuth2ParameterNames.CLIENT_ID, registeredClientResult.getClientId()).toUriString();
|
||||||
|
|
||||||
assertThat(clientRegistrationResult.getRegistrationClientUrl().toString()).isEqualTo(expectedRegistrationClientUrl);
|
assertThat(clientRegistrationResult.getRegistrationClientUrl().toString()).isEqualTo(expectedRegistrationClientUrl);
|
||||||
@@ -808,9 +809,9 @@ public class OidcClientRegistrationAuthenticationProviderTests {
|
|||||||
assertThat(clientRegistrationResult.getIdTokenSignedResponseAlgorithm())
|
assertThat(clientRegistrationResult.getIdTokenSignedResponseAlgorithm())
|
||||||
.isEqualTo(registeredClient.getTokenSettings().getIdTokenSignatureAlgorithm().getName());
|
.isEqualTo(registeredClient.getTokenSettings().getIdTokenSignatureAlgorithm().getName());
|
||||||
|
|
||||||
ProviderContext providerContext = ProviderContextHolder.getProviderContext();
|
AuthorizationServerContext authorizationServerContext = AuthorizationServerContextHolder.getContext();
|
||||||
String expectedRegistrationClientUrl = UriComponentsBuilder.fromUriString(providerContext.getIssuer())
|
String expectedRegistrationClientUrl = UriComponentsBuilder.fromUriString(authorizationServerContext.getIssuer())
|
||||||
.path(providerContext.getProviderSettings().getOidcClientRegistrationEndpoint())
|
.path(authorizationServerContext.getAuthorizationServerSettings().getOidcClientRegistrationEndpoint())
|
||||||
.queryParam(OAuth2ParameterNames.CLIENT_ID, registeredClient.getClientId()).toUriString();
|
.queryParam(OAuth2ParameterNames.CLIENT_ID, registeredClient.getClientId()).toUriString();
|
||||||
|
|
||||||
assertThat(clientRegistrationResult.getRegistrationClientUrl().toString()).isEqualTo(expectedRegistrationClientUrl);
|
assertThat(clientRegistrationResult.getRegistrationClientUrl().toString()).isEqualTo(expectedRegistrationClientUrl);
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ import org.junit.Test;
|
|||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.mock.web.MockHttpServletRequest;
|
import org.springframework.mock.web.MockHttpServletRequest;
|
||||||
import org.springframework.mock.web.MockHttpServletResponse;
|
import org.springframework.mock.web.MockHttpServletResponse;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||||
@@ -46,20 +46,14 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
|||||||
|
|
||||||
@After
|
@After
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
ProviderContextHolder.resetProviderContext();
|
AuthorizationServerContextHolder.resetContext();
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void constructorWhenProviderSettingsNullThenThrowIllegalArgumentException() {
|
|
||||||
assertThatIllegalArgumentException()
|
|
||||||
.isThrownBy(() -> new OidcProviderConfigurationEndpointFilter(null))
|
|
||||||
.withMessage("providerSettings cannot be null");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void doFilterWhenNotConfigurationRequestThenNotProcessed() throws Exception {
|
public void doFilterWhenNotConfigurationRequestThenNotProcessed() throws Exception {
|
||||||
OidcProviderConfigurationEndpointFilter filter =
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().build();
|
||||||
new OidcProviderConfigurationEndpointFilter(ProviderSettings.builder().build());
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
|
OidcProviderConfigurationEndpointFilter filter = new OidcProviderConfigurationEndpointFilter();
|
||||||
|
|
||||||
String requestUri = "/path";
|
String requestUri = "/path";
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||||
@@ -74,8 +68,9 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void doFilterWhenConfigurationRequestPostThenNotProcessed() throws Exception {
|
public void doFilterWhenConfigurationRequestPostThenNotProcessed() throws Exception {
|
||||||
OidcProviderConfigurationEndpointFilter filter =
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().build();
|
||||||
new OidcProviderConfigurationEndpointFilter(ProviderSettings.builder().build());
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
|
OidcProviderConfigurationEndpointFilter filter = new OidcProviderConfigurationEndpointFilter();
|
||||||
|
|
||||||
String requestUri = DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
String requestUri = DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("POST", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("POST", requestUri);
|
||||||
@@ -98,7 +93,7 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
|||||||
String tokenRevocationEndpoint = "/oauth2/v1/revoke";
|
String tokenRevocationEndpoint = "/oauth2/v1/revoke";
|
||||||
String tokenIntrospectionEndpoint = "/oauth2/v1/introspect";
|
String tokenIntrospectionEndpoint = "/oauth2/v1/introspect";
|
||||||
|
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder()
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
.issuer(issuer)
|
.issuer(issuer)
|
||||||
.authorizationEndpoint(authorizationEndpoint)
|
.authorizationEndpoint(authorizationEndpoint)
|
||||||
.tokenEndpoint(tokenEndpoint)
|
.tokenEndpoint(tokenEndpoint)
|
||||||
@@ -107,9 +102,8 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
|||||||
.tokenRevocationEndpoint(tokenRevocationEndpoint)
|
.tokenRevocationEndpoint(tokenRevocationEndpoint)
|
||||||
.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint)
|
.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint)
|
||||||
.build();
|
.build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
OidcProviderConfigurationEndpointFilter filter =
|
OidcProviderConfigurationEndpointFilter filter = new OidcProviderConfigurationEndpointFilter();
|
||||||
new OidcProviderConfigurationEndpointFilter(providerSettings);
|
|
||||||
|
|
||||||
String requestUri = DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
String requestUri = DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||||
@@ -141,13 +135,12 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void doFilterWhenProviderSettingsWithInvalidIssuerThenThrowIllegalArgumentException() {
|
public void doFilterWhenAuthorizationServerSettingsWithInvalidIssuerThenThrowIllegalArgumentException() {
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder()
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
.issuer("https://this is an invalid URL")
|
.issuer("https://this is an invalid URL")
|
||||||
.build();
|
.build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
OidcProviderConfigurationEndpointFilter filter =
|
OidcProviderConfigurationEndpointFilter filter = new OidcProviderConfigurationEndpointFilter();
|
||||||
new OidcProviderConfigurationEndpointFilter(providerSettings);
|
|
||||||
|
|
||||||
String requestUri = DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
String requestUri = DEFAULT_OIDC_PROVIDER_CONFIGURATION_ENDPOINT_URI;
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||||
@@ -159,4 +152,5 @@ public class OidcProviderConfigurationEndpointFilterTests {
|
|||||||
.isThrownBy(() -> filter.doFilter(request, response, filterChain))
|
.isThrownBy(() -> filter.doFilter(request, response, filterChain))
|
||||||
.withMessage("issuer must be a valid URL");
|
.withMessage("issuer must be a valid URL");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -21,24 +21,24 @@ import static org.assertj.core.api.Assertions.assertThat;
|
|||||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests for {@link ProviderSettings}.
|
* Tests for {@link AuthorizationServerSettings}.
|
||||||
*
|
*
|
||||||
* @author Daniel Garnier-Moiroux
|
* @author Daniel Garnier-Moiroux
|
||||||
*/
|
*/
|
||||||
public class ProviderSettingsTests {
|
public class AuthorizationServerSettingsTests {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void buildWhenDefaultThenDefaultsAreSet() {
|
public void buildWhenDefaultThenDefaultsAreSet() {
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().build();
|
||||||
|
|
||||||
assertThat(providerSettings.getIssuer()).isNull();
|
assertThat(authorizationServerSettings.getIssuer()).isNull();
|
||||||
assertThat(providerSettings.getAuthorizationEndpoint()).isEqualTo("/oauth2/authorize");
|
assertThat(authorizationServerSettings.getAuthorizationEndpoint()).isEqualTo("/oauth2/authorize");
|
||||||
assertThat(providerSettings.getTokenEndpoint()).isEqualTo("/oauth2/token");
|
assertThat(authorizationServerSettings.getTokenEndpoint()).isEqualTo("/oauth2/token");
|
||||||
assertThat(providerSettings.getJwkSetEndpoint()).isEqualTo("/oauth2/jwks");
|
assertThat(authorizationServerSettings.getJwkSetEndpoint()).isEqualTo("/oauth2/jwks");
|
||||||
assertThat(providerSettings.getTokenRevocationEndpoint()).isEqualTo("/oauth2/revoke");
|
assertThat(authorizationServerSettings.getTokenRevocationEndpoint()).isEqualTo("/oauth2/revoke");
|
||||||
assertThat(providerSettings.getTokenIntrospectionEndpoint()).isEqualTo("/oauth2/introspect");
|
assertThat(authorizationServerSettings.getTokenIntrospectionEndpoint()).isEqualTo("/oauth2/introspect");
|
||||||
assertThat(providerSettings.getOidcClientRegistrationEndpoint()).isEqualTo("/connect/register");
|
assertThat(authorizationServerSettings.getOidcClientRegistrationEndpoint()).isEqualTo("/connect/register");
|
||||||
assertThat(providerSettings.getOidcUserInfoEndpoint()).isEqualTo("/userinfo");
|
assertThat(authorizationServerSettings.getOidcUserInfoEndpoint()).isEqualTo("/userinfo");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -52,7 +52,7 @@ public class ProviderSettingsTests {
|
|||||||
String oidcUserInfoEndpoint = "/connect/v1/userinfo";
|
String oidcUserInfoEndpoint = "/connect/v1/userinfo";
|
||||||
String issuer = "https://example.com:9000";
|
String issuer = "https://example.com:9000";
|
||||||
|
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder()
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
.issuer(issuer)
|
.issuer(issuer)
|
||||||
.authorizationEndpoint(authorizationEndpoint)
|
.authorizationEndpoint(authorizationEndpoint)
|
||||||
.tokenEndpoint(tokenEndpoint)
|
.tokenEndpoint(tokenEndpoint)
|
||||||
@@ -64,81 +64,81 @@ public class ProviderSettingsTests {
|
|||||||
.oidcUserInfoEndpoint(oidcUserInfoEndpoint)
|
.oidcUserInfoEndpoint(oidcUserInfoEndpoint)
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
assertThat(providerSettings.getIssuer()).isEqualTo(issuer);
|
assertThat(authorizationServerSettings.getIssuer()).isEqualTo(issuer);
|
||||||
assertThat(providerSettings.getAuthorizationEndpoint()).isEqualTo(authorizationEndpoint);
|
assertThat(authorizationServerSettings.getAuthorizationEndpoint()).isEqualTo(authorizationEndpoint);
|
||||||
assertThat(providerSettings.getTokenEndpoint()).isEqualTo(tokenEndpoint);
|
assertThat(authorizationServerSettings.getTokenEndpoint()).isEqualTo(tokenEndpoint);
|
||||||
assertThat(providerSettings.getJwkSetEndpoint()).isEqualTo(jwkSetEndpoint);
|
assertThat(authorizationServerSettings.getJwkSetEndpoint()).isEqualTo(jwkSetEndpoint);
|
||||||
assertThat(providerSettings.getTokenRevocationEndpoint()).isEqualTo(tokenRevocationEndpoint);
|
assertThat(authorizationServerSettings.getTokenRevocationEndpoint()).isEqualTo(tokenRevocationEndpoint);
|
||||||
assertThat(providerSettings.getTokenIntrospectionEndpoint()).isEqualTo(tokenIntrospectionEndpoint);
|
assertThat(authorizationServerSettings.getTokenIntrospectionEndpoint()).isEqualTo(tokenIntrospectionEndpoint);
|
||||||
assertThat(providerSettings.getOidcClientRegistrationEndpoint()).isEqualTo(oidcClientRegistrationEndpoint);
|
assertThat(authorizationServerSettings.getOidcClientRegistrationEndpoint()).isEqualTo(oidcClientRegistrationEndpoint);
|
||||||
assertThat(providerSettings.getOidcUserInfoEndpoint()).isEqualTo(oidcUserInfoEndpoint);
|
assertThat(authorizationServerSettings.getOidcUserInfoEndpoint()).isEqualTo(oidcUserInfoEndpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void settingWhenCustomThenSet() {
|
public void settingWhenCustomThenSet() {
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder()
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
.setting("name1", "value1")
|
.setting("name1", "value1")
|
||||||
.settings(settings -> settings.put("name2", "value2"))
|
.settings(settings -> settings.put("name2", "value2"))
|
||||||
.build();
|
.build();
|
||||||
|
|
||||||
assertThat(providerSettings.getSettings()).hasSize(9);
|
assertThat(authorizationServerSettings.getSettings()).hasSize(9);
|
||||||
assertThat(providerSettings.<String>getSetting("name1")).isEqualTo("value1");
|
assertThat(authorizationServerSettings.<String>getSetting("name1")).isEqualTo("value1");
|
||||||
assertThat(providerSettings.<String>getSetting("name2")).isEqualTo("value2");
|
assertThat(authorizationServerSettings.<String>getSetting("name2")).isEqualTo("value2");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void issuerWhenNullThenThrowIllegalArgumentException() {
|
public void issuerWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().issuer(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().issuer(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void authorizationEndpointWhenNullThenThrowIllegalArgumentException() {
|
public void authorizationEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().authorizationEndpoint(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().authorizationEndpoint(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void tokenEndpointWhenNullThenThrowIllegalArgumentException() {
|
public void tokenEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().tokenEndpoint(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().tokenEndpoint(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void tokenRevocationEndpointWhenNullThenThrowIllegalArgumentException() {
|
public void tokenRevocationEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().tokenRevocationEndpoint(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().tokenRevocationEndpoint(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void tokenIntrospectionEndpointWhenNullThenThrowIllegalArgumentException() {
|
public void tokenIntrospectionEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().tokenIntrospectionEndpoint(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().tokenIntrospectionEndpoint(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void oidcClientRegistrationEndpointWhenNullThenThrowIllegalArgumentException() {
|
public void oidcClientRegistrationEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().oidcClientRegistrationEndpoint(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().oidcClientRegistrationEndpoint(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void oidcUserInfoEndpointWhenNullThenThrowIllegalArgumentException() {
|
public void oidcUserInfoEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().oidcUserInfoEndpoint(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().oidcUserInfoEndpoint(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void jwksEndpointWhenNullThenThrowIllegalArgumentException() {
|
public void jwksEndpointWhenNullThenThrowIllegalArgumentException() {
|
||||||
assertThatIllegalArgumentException()
|
assertThatIllegalArgumentException()
|
||||||
.isThrownBy(() -> ProviderSettings.builder().jwkSetEndpoint(null))
|
.isThrownBy(() -> AuthorizationServerSettings.builder().jwkSetEndpoint(null))
|
||||||
.withMessage("value cannot be null");
|
.withMessage("value cannot be null");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -46,9 +46,10 @@ import org.springframework.security.oauth2.server.authorization.authentication.O
|
|||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
@@ -66,7 +67,7 @@ public class JwtGeneratorTests {
|
|||||||
private JwtEncoder jwtEncoder;
|
private JwtEncoder jwtEncoder;
|
||||||
private OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer;
|
private OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer;
|
||||||
private JwtGenerator jwtGenerator;
|
private JwtGenerator jwtGenerator;
|
||||||
private ProviderContext providerContext;
|
private AuthorizationServerContext authorizationServerContext;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
@@ -74,8 +75,8 @@ public class JwtGeneratorTests {
|
|||||||
this.jwtCustomizer = mock(OAuth2TokenCustomizer.class);
|
this.jwtCustomizer = mock(OAuth2TokenCustomizer.class);
|
||||||
this.jwtGenerator = new JwtGenerator(this.jwtEncoder);
|
this.jwtGenerator = new JwtGenerator(this.jwtEncoder);
|
||||||
this.jwtGenerator.setJwtCustomizer(this.jwtCustomizer);
|
this.jwtGenerator.setJwtCustomizer(this.jwtCustomizer);
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer("https://provider.com").build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
|
||||||
this.providerContext = new ProviderContext(providerSettings, null);
|
this.authorizationServerContext = new TestAuthorizationServerContext(authorizationServerSettings, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -137,7 +138,7 @@ public class JwtGeneratorTests {
|
|||||||
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(authorization.getAttribute(Principal.class.getName()))
|
.principal(authorization.getAttribute(Principal.class.getName()))
|
||||||
.providerContext(this.providerContext)
|
.authorizationServerContext(this.authorizationServerContext)
|
||||||
.authorization(authorization)
|
.authorization(authorization)
|
||||||
.authorizedScopes(authorization.getAuthorizedScopes())
|
.authorizedScopes(authorization.getAuthorizedScopes())
|
||||||
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
||||||
@@ -168,7 +169,7 @@ public class JwtGeneratorTests {
|
|||||||
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(authorization.getAttribute(Principal.class.getName()))
|
.principal(authorization.getAttribute(Principal.class.getName()))
|
||||||
.providerContext(this.providerContext)
|
.authorizationServerContext(this.authorizationServerContext)
|
||||||
.authorization(authorization)
|
.authorization(authorization)
|
||||||
.authorizedScopes(authorization.getAuthorizedScopes())
|
.authorizedScopes(authorization.getAuthorizedScopes())
|
||||||
.tokenType(ID_TOKEN_TOKEN_TYPE)
|
.tokenType(ID_TOKEN_TOKEN_TYPE)
|
||||||
@@ -204,7 +205,7 @@ public class JwtGeneratorTests {
|
|||||||
assertThat(jwsHeader.getAlgorithm()).isEqualTo(SignatureAlgorithm.RS256);
|
assertThat(jwsHeader.getAlgorithm()).isEqualTo(SignatureAlgorithm.RS256);
|
||||||
|
|
||||||
JwtClaimsSet jwtClaimsSet = jwtEncoderParametersCaptor.getValue().getClaims();
|
JwtClaimsSet jwtClaimsSet = jwtEncoderParametersCaptor.getValue().getClaims();
|
||||||
assertThat(jwtClaimsSet.getIssuer().toExternalForm()).isEqualTo(tokenContext.getProviderContext().getIssuer());
|
assertThat(jwtClaimsSet.getIssuer().toExternalForm()).isEqualTo(tokenContext.getAuthorizationServerContext().getIssuer());
|
||||||
assertThat(jwtClaimsSet.getSubject()).isEqualTo(tokenContext.getAuthorization().getPrincipalName());
|
assertThat(jwtClaimsSet.getSubject()).isEqualTo(tokenContext.getAuthorization().getPrincipalName());
|
||||||
assertThat(jwtClaimsSet.getAudience()).containsExactly(tokenContext.getRegisteredClient().getClientId());
|
assertThat(jwtClaimsSet.getAudience()).containsExactly(tokenContext.getRegisteredClient().getClientId());
|
||||||
|
|
||||||
|
|||||||
@@ -38,9 +38,10 @@ import org.springframework.security.oauth2.server.authorization.authentication.O
|
|||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
import org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.TokenSettings;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
@@ -56,15 +57,15 @@ import static org.mockito.Mockito.verify;
|
|||||||
public class OAuth2AccessTokenGeneratorTests {
|
public class OAuth2AccessTokenGeneratorTests {
|
||||||
private OAuth2TokenCustomizer<OAuth2TokenClaimsContext> accessTokenCustomizer;
|
private OAuth2TokenCustomizer<OAuth2TokenClaimsContext> accessTokenCustomizer;
|
||||||
private OAuth2AccessTokenGenerator accessTokenGenerator;
|
private OAuth2AccessTokenGenerator accessTokenGenerator;
|
||||||
private ProviderContext providerContext;
|
private AuthorizationServerContext authorizationServerContext;
|
||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
this.accessTokenCustomizer = mock(OAuth2TokenCustomizer.class);
|
this.accessTokenCustomizer = mock(OAuth2TokenCustomizer.class);
|
||||||
this.accessTokenGenerator = new OAuth2AccessTokenGenerator();
|
this.accessTokenGenerator = new OAuth2AccessTokenGenerator();
|
||||||
this.accessTokenGenerator.setAccessTokenCustomizer(this.accessTokenCustomizer);
|
this.accessTokenGenerator.setAccessTokenCustomizer(this.accessTokenCustomizer);
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer("https://provider.com").build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().issuer("https://provider.com").build();
|
||||||
this.providerContext = new ProviderContext(providerSettings, null);
|
this.authorizationServerContext = new TestAuthorizationServerContext(authorizationServerSettings, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -134,7 +135,7 @@ public class OAuth2AccessTokenGeneratorTests {
|
|||||||
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
OAuth2TokenContext tokenContext = DefaultOAuth2TokenContext.builder()
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(principal)
|
.principal(principal)
|
||||||
.providerContext(this.providerContext)
|
.authorizationServerContext(this.authorizationServerContext)
|
||||||
.authorization(authorization)
|
.authorization(authorization)
|
||||||
.authorizedScopes(authorization.getAuthorizedScopes())
|
.authorizedScopes(authorization.getAuthorizedScopes())
|
||||||
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
||||||
@@ -156,7 +157,7 @@ public class OAuth2AccessTokenGeneratorTests {
|
|||||||
OAuth2TokenClaimAccessor accessTokenClaims = ((ClaimAccessor) accessToken)::getClaims;
|
OAuth2TokenClaimAccessor accessTokenClaims = ((ClaimAccessor) accessToken)::getClaims;
|
||||||
assertThat(accessTokenClaims.getClaims()).isNotEmpty();
|
assertThat(accessTokenClaims.getClaims()).isNotEmpty();
|
||||||
|
|
||||||
assertThat(accessTokenClaims.getIssuer().toExternalForm()).isEqualTo(tokenContext.getProviderContext().getIssuer());
|
assertThat(accessTokenClaims.getIssuer().toExternalForm()).isEqualTo(tokenContext.getAuthorizationServerContext().getIssuer());
|
||||||
assertThat(accessTokenClaims.getSubject()).isEqualTo(tokenContext.getPrincipal().getName());
|
assertThat(accessTokenClaims.getSubject()).isEqualTo(tokenContext.getPrincipal().getName());
|
||||||
assertThat(accessTokenClaims.getAudience()).isEqualTo(
|
assertThat(accessTokenClaims.getAudience()).isEqualTo(
|
||||||
Collections.singletonList(tokenContext.getRegisteredClient().getClientId()));
|
Collections.singletonList(tokenContext.getRegisteredClient().getClientId()));
|
||||||
@@ -175,7 +176,7 @@ public class OAuth2AccessTokenGeneratorTests {
|
|||||||
assertThat(tokenClaimsContext.getClaims()).isNotNull();
|
assertThat(tokenClaimsContext.getClaims()).isNotNull();
|
||||||
assertThat(tokenClaimsContext.getRegisteredClient()).isEqualTo(tokenContext.getRegisteredClient());
|
assertThat(tokenClaimsContext.getRegisteredClient()).isEqualTo(tokenContext.getRegisteredClient());
|
||||||
assertThat(tokenClaimsContext.<Authentication>getPrincipal()).isEqualTo(tokenContext.getPrincipal());
|
assertThat(tokenClaimsContext.<Authentication>getPrincipal()).isEqualTo(tokenContext.getPrincipal());
|
||||||
assertThat(tokenClaimsContext.getProviderContext()).isEqualTo(tokenContext.getProviderContext());
|
assertThat(tokenClaimsContext.getAuthorizationServerContext()).isEqualTo(tokenContext.getAuthorizationServerContext());
|
||||||
assertThat(tokenClaimsContext.getAuthorization()).isEqualTo(tokenContext.getAuthorization());
|
assertThat(tokenClaimsContext.getAuthorization()).isEqualTo(tokenContext.getAuthorization());
|
||||||
assertThat(tokenClaimsContext.getAuthorizedScopes()).isEqualTo(tokenContext.getAuthorizedScopes());
|
assertThat(tokenClaimsContext.getAuthorizedScopes()).isEqualTo(tokenContext.getAuthorizedScopes());
|
||||||
assertThat(tokenClaimsContext.getTokenType()).isEqualTo(tokenContext.getTokenType());
|
assertThat(tokenClaimsContext.getTokenType()).isEqualTo(tokenContext.getTokenType());
|
||||||
|
|||||||
@@ -34,8 +34,9 @@ import org.springframework.security.oauth2.server.authorization.authentication.O
|
|||||||
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
import org.springframework.security.oauth2.server.authorization.authentication.OAuth2ClientAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
import org.springframework.security.oauth2.server.authorization.client.TestRegisteredClients;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
||||||
@@ -74,8 +75,8 @@ public class OAuth2TokenClaimsContextTests {
|
|||||||
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
|
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
|
||||||
OAuth2Authorization authorization = TestOAuth2Authorizations.authorization(registeredClient).build();
|
OAuth2Authorization authorization = TestOAuth2Authorizations.authorization(registeredClient).build();
|
||||||
Authentication principal = authorization.getAttribute(Principal.class.getName());
|
Authentication principal = authorization.getAttribute(Principal.class.getName());
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer(issuer).build();
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder().issuer(issuer).build();
|
||||||
ProviderContext providerContext = new ProviderContext(providerSettings, null);
|
AuthorizationServerContext authorizationServerContext = new TestAuthorizationServerContext(authorizationServerSettings, null);
|
||||||
OAuth2ClientAuthenticationToken clientPrincipal = new OAuth2ClientAuthenticationToken(
|
OAuth2ClientAuthenticationToken clientPrincipal = new OAuth2ClientAuthenticationToken(
|
||||||
registeredClient, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, registeredClient.getClientSecret());
|
registeredClient, ClientAuthenticationMethod.CLIENT_SECRET_BASIC, registeredClient.getClientSecret());
|
||||||
OAuth2AuthorizationRequest authorizationRequest = authorization.getAttribute(
|
OAuth2AuthorizationRequest authorizationRequest = authorization.getAttribute(
|
||||||
@@ -88,7 +89,7 @@ public class OAuth2TokenClaimsContextTests {
|
|||||||
OAuth2TokenClaimsContext context = OAuth2TokenClaimsContext.with(claims)
|
OAuth2TokenClaimsContext context = OAuth2TokenClaimsContext.with(claims)
|
||||||
.registeredClient(registeredClient)
|
.registeredClient(registeredClient)
|
||||||
.principal(principal)
|
.principal(principal)
|
||||||
.providerContext(providerContext)
|
.authorizationServerContext(authorizationServerContext)
|
||||||
.authorization(authorization)
|
.authorization(authorization)
|
||||||
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
.tokenType(OAuth2TokenType.ACCESS_TOKEN)
|
||||||
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
|
||||||
@@ -101,7 +102,7 @@ public class OAuth2TokenClaimsContextTests {
|
|||||||
assertThat(context.getClaims()).isEqualTo(claims);
|
assertThat(context.getClaims()).isEqualTo(claims);
|
||||||
assertThat(context.getRegisteredClient()).isEqualTo(registeredClient);
|
assertThat(context.getRegisteredClient()).isEqualTo(registeredClient);
|
||||||
assertThat(context.<Authentication>getPrincipal()).isEqualTo(principal);
|
assertThat(context.<Authentication>getPrincipal()).isEqualTo(principal);
|
||||||
assertThat(context.getProviderContext()).isEqualTo(providerContext);
|
assertThat(context.getAuthorizationServerContext()).isEqualTo(authorizationServerContext);
|
||||||
assertThat(context.getAuthorization()).isEqualTo(authorization);
|
assertThat(context.getAuthorization()).isEqualTo(authorization);
|
||||||
assertThat(context.getTokenType()).isEqualTo(OAuth2TokenType.ACCESS_TOKEN);
|
assertThat(context.getTokenType()).isEqualTo(OAuth2TokenType.ACCESS_TOKEN);
|
||||||
assertThat(context.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE);
|
assertThat(context.getAuthorizationGrantType()).isEqualTo(AuthorizationGrantType.AUTHORIZATION_CODE);
|
||||||
|
|||||||
@@ -25,9 +25,9 @@ import org.junit.Test;
|
|||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.mock.web.MockHttpServletRequest;
|
import org.springframework.mock.web.MockHttpServletRequest;
|
||||||
import org.springframework.mock.web.MockHttpServletResponse;
|
import org.springframework.mock.web.MockHttpServletResponse;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
import org.springframework.security.oauth2.server.authorization.context.AuthorizationServerContextHolder;
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
import org.springframework.security.oauth2.server.authorization.context.TestAuthorizationServerContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
import static org.assertj.core.api.Assertions.assertThat;
|
||||||
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
|
||||||
@@ -46,20 +46,16 @@ public class OAuth2AuthorizationServerMetadataEndpointFilterTests {
|
|||||||
|
|
||||||
@After
|
@After
|
||||||
public void cleanup() {
|
public void cleanup() {
|
||||||
ProviderContextHolder.resetProviderContext();
|
AuthorizationServerContextHolder.resetContext();
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void constructorWhenProviderSettingsNullThenThrowIllegalArgumentException() {
|
|
||||||
assertThatIllegalArgumentException()
|
|
||||||
.isThrownBy(() -> new OAuth2AuthorizationServerMetadataEndpointFilter(null))
|
|
||||||
.withMessage("providerSettings cannot be null");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void doFilterWhenNotAuthorizationServerMetadataRequestThenNotProcessed() throws Exception {
|
public void doFilterWhenNotAuthorizationServerMetadataRequestThenNotProcessed() throws Exception {
|
||||||
OAuth2AuthorizationServerMetadataEndpointFilter filter =
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
new OAuth2AuthorizationServerMetadataEndpointFilter(ProviderSettings.builder().issuer("https://example.com").build());
|
.issuer("https://example.com")
|
||||||
|
.build();
|
||||||
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
|
OAuth2AuthorizationServerMetadataEndpointFilter filter = new OAuth2AuthorizationServerMetadataEndpointFilter();
|
||||||
|
|
||||||
String requestUri = "/path";
|
String requestUri = "/path";
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||||
@@ -74,8 +70,11 @@ public class OAuth2AuthorizationServerMetadataEndpointFilterTests {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void doFilterWhenAuthorizationServerMetadataRequestPostThenNotProcessed() throws Exception {
|
public void doFilterWhenAuthorizationServerMetadataRequestPostThenNotProcessed() throws Exception {
|
||||||
OAuth2AuthorizationServerMetadataEndpointFilter filter =
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
new OAuth2AuthorizationServerMetadataEndpointFilter(ProviderSettings.builder().issuer("https://example.com").build());
|
.issuer("https://example.com")
|
||||||
|
.build();
|
||||||
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
|
OAuth2AuthorizationServerMetadataEndpointFilter filter = new OAuth2AuthorizationServerMetadataEndpointFilter();
|
||||||
|
|
||||||
String requestUri = DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI;
|
String requestUri = DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI;
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("POST", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("POST", requestUri);
|
||||||
@@ -97,7 +96,7 @@ public class OAuth2AuthorizationServerMetadataEndpointFilterTests {
|
|||||||
String tokenRevocationEndpoint = "/oauth2/v1/revoke";
|
String tokenRevocationEndpoint = "/oauth2/v1/revoke";
|
||||||
String tokenIntrospectionEndpoint = "/oauth2/v1/introspect";
|
String tokenIntrospectionEndpoint = "/oauth2/v1/introspect";
|
||||||
|
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder()
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
.issuer(issuer)
|
.issuer(issuer)
|
||||||
.authorizationEndpoint(authorizationEndpoint)
|
.authorizationEndpoint(authorizationEndpoint)
|
||||||
.tokenEndpoint(tokenEndpoint)
|
.tokenEndpoint(tokenEndpoint)
|
||||||
@@ -105,9 +104,8 @@ public class OAuth2AuthorizationServerMetadataEndpointFilterTests {
|
|||||||
.tokenRevocationEndpoint(tokenRevocationEndpoint)
|
.tokenRevocationEndpoint(tokenRevocationEndpoint)
|
||||||
.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint)
|
.tokenIntrospectionEndpoint(tokenIntrospectionEndpoint)
|
||||||
.build();
|
.build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
OAuth2AuthorizationServerMetadataEndpointFilter filter =
|
OAuth2AuthorizationServerMetadataEndpointFilter filter = new OAuth2AuthorizationServerMetadataEndpointFilter();
|
||||||
new OAuth2AuthorizationServerMetadataEndpointFilter(providerSettings);
|
|
||||||
|
|
||||||
String requestUri = DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI;
|
String requestUri = DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI;
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||||
@@ -136,13 +134,12 @@ public class OAuth2AuthorizationServerMetadataEndpointFilterTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void doFilterWhenProviderSettingsWithInvalidIssuerThenThrowIllegalArgumentException() {
|
public void doFilterWhenAuthorizationServerSettingsWithInvalidIssuerThenThrowIllegalArgumentException() {
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder()
|
AuthorizationServerSettings authorizationServerSettings = AuthorizationServerSettings.builder()
|
||||||
.issuer("https://this is an invalid URL")
|
.issuer("https://this is an invalid URL")
|
||||||
.build();
|
.build();
|
||||||
ProviderContextHolder.setProviderContext(new ProviderContext(providerSettings, null));
|
AuthorizationServerContextHolder.setContext(new TestAuthorizationServerContext(authorizationServerSettings, null));
|
||||||
OAuth2AuthorizationServerMetadataEndpointFilter filter =
|
OAuth2AuthorizationServerMetadataEndpointFilter filter = new OAuth2AuthorizationServerMetadataEndpointFilter();
|
||||||
new OAuth2AuthorizationServerMetadataEndpointFilter(providerSettings);
|
|
||||||
|
|
||||||
String requestUri = DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI;
|
String requestUri = DEFAULT_OAUTH2_AUTHORIZATION_SERVER_METADATA_ENDPOINT_URI;
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
MockHttpServletRequest request = new MockHttpServletRequest("GET", requestUri);
|
||||||
|
|||||||
@@ -1,101 +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.web;
|
|
||||||
|
|
||||||
import jakarta.servlet.FilterChain;
|
|
||||||
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
import org.springframework.mock.web.MockHttpServletRequest;
|
|
||||||
import org.springframework.mock.web.MockHttpServletResponse;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContext;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.context.ProviderContextHolder;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
|
|
||||||
import static org.assertj.core.api.Assertions.assertThat;
|
|
||||||
import static org.assertj.core.api.Assertions.assertThatThrownBy;
|
|
||||||
import static org.mockito.ArgumentMatchers.any;
|
|
||||||
import static org.mockito.Mockito.doAnswer;
|
|
||||||
import static org.mockito.Mockito.mock;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Tests for {@link ProviderContextFilter}.
|
|
||||||
*
|
|
||||||
* @author Joe Grandja
|
|
||||||
*/
|
|
||||||
public class ProviderContextFilterTests {
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void cleanup() {
|
|
||||||
ProviderContextHolder.resetProviderContext();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void constructorWhenProviderSettingsNullThenThrowIllegalArgumentException() {
|
|
||||||
assertThatThrownBy(() -> new ProviderContextFilter(null))
|
|
||||||
.isInstanceOf(IllegalArgumentException.class)
|
|
||||||
.hasMessage("providerSettings cannot be null");
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void doFilterWhenIssuerConfiguredThenUsed() throws Exception {
|
|
||||||
String issuer = "https://provider.com";
|
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().issuer(issuer).build();
|
|
||||||
ProviderContextFilter filter = new ProviderContextFilter(providerSettings);
|
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/");
|
|
||||||
request.setServletPath("/");
|
|
||||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
||||||
FilterChain filterChain = mock(FilterChain.class);
|
|
||||||
|
|
||||||
doAnswer(invocation -> {
|
|
||||||
ProviderContext providerContext = ProviderContextHolder.getProviderContext();
|
|
||||||
assertThat(providerContext).isNotNull();
|
|
||||||
assertThat(providerContext.getProviderSettings()).isSameAs(providerSettings);
|
|
||||||
assertThat(providerContext.getIssuer()).isEqualTo(issuer);
|
|
||||||
return null;
|
|
||||||
}).when(filterChain).doFilter(any(), any());
|
|
||||||
|
|
||||||
filter.doFilter(request, response, filterChain);
|
|
||||||
|
|
||||||
assertThat(ProviderContextHolder.getProviderContext()).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
public void doFilterWhenIssuerNotConfiguredThenResolveFromRequest() throws Exception {
|
|
||||||
ProviderSettings providerSettings = ProviderSettings.builder().build();
|
|
||||||
ProviderContextFilter filter = new ProviderContextFilter(providerSettings);
|
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest("GET", "/");
|
|
||||||
request.setServletPath("/");
|
|
||||||
MockHttpServletResponse response = new MockHttpServletResponse();
|
|
||||||
FilterChain filterChain = mock(FilterChain.class);
|
|
||||||
|
|
||||||
doAnswer(invocation -> {
|
|
||||||
ProviderContext providerContext = ProviderContextHolder.getProviderContext();
|
|
||||||
assertThat(providerContext).isNotNull();
|
|
||||||
assertThat(providerContext.getProviderSettings()).isSameAs(providerSettings);
|
|
||||||
assertThat(providerContext.getIssuer()).isEqualTo("http://localhost");
|
|
||||||
return null;
|
|
||||||
}).when(filterChain).doFilter(any(), any());
|
|
||||||
|
|
||||||
filter.doFilter(request, response, filterChain);
|
|
||||||
|
|
||||||
assertThat(ProviderContextHolder.getProviderContext()).isNull();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -40,8 +40,8 @@ import org.springframework.security.oauth2.server.authorization.client.Registere
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configurers.OAuth2AuthorizationServerConfigurer;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
||||||
import org.springframework.security.web.util.matcher.RequestMatcher;
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||||
@@ -115,8 +115,8 @@ public class AuthorizationServerConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ProviderSettings providerSettings() {
|
public AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer("http://localhost:9000").build();
|
return AuthorizationServerSettings.builder().issuer("http://localhost:9000").build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|||||||
@@ -45,8 +45,8 @@ import org.springframework.security.oauth2.server.authorization.client.JdbcRegis
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
import org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint;
|
||||||
|
|
||||||
@@ -121,8 +121,8 @@ public class AuthorizationServerConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ProviderSettings providerSettings() {
|
public AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer("http://localhost:9000").build();
|
return AuthorizationServerSettings.builder().issuer("http://localhost:9000").build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|||||||
@@ -47,8 +47,8 @@ import org.springframework.security.oauth2.server.authorization.client.JdbcRegis
|
|||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClient;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.oauth2.server.authorization.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
|
import org.springframework.security.oauth2.server.authorization.settings.AuthorizationServerSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
import org.springframework.security.oauth2.server.authorization.settings.ClientSettings;
|
||||||
import org.springframework.security.oauth2.server.authorization.settings.ProviderSettings;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.token.JwtEncodingContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;
|
import org.springframework.security.oauth2.server.authorization.token.OAuth2TokenCustomizer;
|
||||||
import org.springframework.security.web.SecurityFilterChain;
|
import org.springframework.security.web.SecurityFilterChain;
|
||||||
@@ -124,8 +124,8 @@ public class AuthorizationServerConfig {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ProviderSettings providerSettings() {
|
public AuthorizationServerSettings authorizationServerSettings() {
|
||||||
return ProviderSettings.builder().issuer("http://localhost:9000").build();
|
return AuthorizationServerSettings.builder().issuer("http://localhost:9000").build();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
|
|||||||
Reference in New Issue
Block a user