diff --git a/oauth2-authorization-server/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/authorization/OAuth2AuthorizationServerConfigurer.java b/oauth2-authorization-server/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/authorization/OAuth2AuthorizationServerConfigurer.java index 9dac342b..1a10cb4b 100644 --- a/oauth2-authorization-server/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/authorization/OAuth2AuthorizationServerConfigurer.java +++ b/oauth2-authorization-server/src/main/java/org/springframework/security/config/annotation/web/configurers/oauth2/server/authorization/OAuth2AuthorizationServerConfigurer.java @@ -19,9 +19,6 @@ import java.net.URI; import java.util.LinkedHashMap; import java.util.Map; -import com.nimbusds.jose.jwk.source.JWKSource; -import com.nimbusds.jose.proc.SecurityContext; - import org.springframework.http.HttpMethod; import org.springframework.http.HttpStatus; import org.springframework.security.authentication.AuthenticationManager; @@ -35,9 +32,6 @@ import org.springframework.security.oauth2.server.authorization.authentication.O import org.springframework.security.oauth2.server.authorization.authentication.OAuth2TokenRevocationAuthenticationProvider; import org.springframework.security.oauth2.server.authorization.client.RegisteredClientRepository; import org.springframework.security.oauth2.server.authorization.config.ProviderSettings; -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.OidcProviderConfigurationEndpointFilter; 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.OAuth2TokenIntrospectionEndpointFilter; @@ -62,15 +56,14 @@ import org.springframework.util.Assert; * @see OAuth2ClientAuthenticationConfigurer * @see OAuth2AuthorizationEndpointConfigurer * @see OAuth2TokenEndpointConfigurer + * @see OidcConfigurer * @see RegisteredClientRepository * @see OAuth2AuthorizationService * @see OAuth2AuthorizationConsentService * @see OAuth2TokenIntrospectionEndpointFilter * @see OAuth2TokenRevocationEndpointFilter * @see NimbusJwkSetEndpointFilter - * @see OidcProviderConfigurationEndpointFilter * @see OAuth2AuthorizationServerMetadataEndpointFilter - * @see OidcClientRegistrationEndpointFilter */ public final class OAuth2AuthorizationServerConfigurer> extends AbstractHttpConfigurer, B> { @@ -79,18 +72,15 @@ public final class OAuth2AuthorizationServerConfigurer getRequestMatcher(OAuth2AuthorizationEndpointConfigurer.class).matches(request) || getRequestMatcher(OAuth2TokenEndpointConfigurer.class).matches(request) || + getRequestMatcher(OidcConfigurer.class).matches(request) || this.tokenIntrospectionEndpointMatcher.matches(request) || this.tokenRevocationEndpointMatcher.matches(request) || this.jwkSetEndpointMatcher.matches(request) || - this.oidcProviderConfigurationEndpointMatcher.matches(request) || - this.authorizationServerMetadataEndpointMatcher.matches(request) || - this.oidcClientRegistrationEndpointMatcher.matches(request); + this.authorizationServerMetadataEndpointMatcher.matches(request); /** * Sets the repository of registered clients. @@ -173,6 +163,17 @@ public final class OAuth2AuthorizationServerConfigurer oidc(Customizer oidcCustomizer) { + oidcCustomizer.customize(getConfigurer(OidcConfigurer.class)); + return this; + } + /** * Returns a {@link RequestMatcher} for the authorization server endpoints. * @@ -201,13 +202,6 @@ public final class OAuth2AuthorizationServerConfigurer exceptionHandling = builder.getConfigurer(ExceptionHandlingConfigurer.class); if (exceptionHandling != null) { exceptionHandling.defaultAuthenticationEntryPointFor( @@ -225,22 +219,6 @@ public final class OAuth2AuthorizationServerConfigurer configurer.configure(builder)); ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder); - if (providerSettings.getIssuer() != null) { - OidcProviderConfigurationEndpointFilter oidcProviderConfigurationEndpointFilter = - new OidcProviderConfigurationEndpointFilter(providerSettings); - builder.addFilterBefore(postProcess(oidcProviderConfigurationEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class); - - OAuth2AuthorizationServerMetadataEndpointFilter authorizationServerMetadataEndpointFilter = - new OAuth2AuthorizationServerMetadataEndpointFilter(providerSettings); - builder.addFilterBefore(postProcess(authorizationServerMetadataEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class); - } - - JWKSource jwkSource = OAuth2ConfigurerUtils.getJwkSource(builder); - NimbusJwkSetEndpointFilter jwkSetEndpointFilter = new NimbusJwkSetEndpointFilter( - jwkSource, - providerSettings.getJwkSetEndpoint()); - builder.addFilterBefore(postProcess(jwkSetEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class); - AuthenticationManager authenticationManager = builder.getSharedObject(AuthenticationManager.class); OAuth2TokenIntrospectionEndpointFilter tokenIntrospectionEndpointFilter = @@ -253,14 +231,19 @@ public final class OAuth2AuthorizationServerConfigurer, AbstractOAuth2Configurer> createConfigurers() { @@ -268,6 +251,7 @@ public final class OAuth2AuthorizationServerConfigurer objectPostProcessor) { + super(objectPostProcessor); + } + + @Override + > void init(B builder) { + List requestMatchers = new ArrayList<>(); + ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder); + if (providerSettings.getIssuer() != null) { + requestMatchers.add( + new AntPathRequestMatcher( + "/.well-known/openid-configuration", + HttpMethod.GET.name())); + } + requestMatchers.add( + new AntPathRequestMatcher( + providerSettings.getOidcClientRegistrationEndpoint(), + HttpMethod.POST.name())); + this.requestMatcher = new OrRequestMatcher(requestMatchers); + + // TODO Make OpenID Client Registration an "opt-in" feature + OidcClientRegistrationAuthenticationProvider oidcClientRegistrationAuthenticationProvider = + new OidcClientRegistrationAuthenticationProvider( + OAuth2ConfigurerUtils.getRegisteredClientRepository(builder), + OAuth2ConfigurerUtils.getAuthorizationService(builder)); + builder.authenticationProvider(postProcess(oidcClientRegistrationAuthenticationProvider)); + } + + @Override + > void configure(B builder) { + ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder); + if (providerSettings.getIssuer() != null) { + OidcProviderConfigurationEndpointFilter oidcProviderConfigurationEndpointFilter = + new OidcProviderConfigurationEndpointFilter(providerSettings); + builder.addFilterBefore(postProcess(oidcProviderConfigurationEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class); + } + + AuthenticationManager authenticationManager = builder.getSharedObject(AuthenticationManager.class); + + // TODO Make OpenID Client Registration an "opt-in" feature + OidcClientRegistrationEndpointFilter oidcClientRegistrationEndpointFilter = + new OidcClientRegistrationEndpointFilter( + authenticationManager, + providerSettings.getOidcClientRegistrationEndpoint()); + builder.addFilterAfter(postProcess(oidcClientRegistrationEndpointFilter), FilterSecurityInterceptor.class); + } + + @Override + RequestMatcher getRequestMatcher() { + return this.requestMatcher; + } + +}