Disable Oidc client registration by default
Closes gh-398
This commit is contained in:
@@ -32,7 +32,6 @@ import org.springframework.core.Ordered;
|
|||||||
import org.springframework.core.annotation.Order;
|
import org.springframework.core.annotation.Order;
|
||||||
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
import org.springframework.security.config.annotation.web.configurers.oauth2.server.authorization.OAuth2AuthorizationServerConfigurer;
|
import org.springframework.security.config.annotation.web.configurers.oauth2.server.authorization.OAuth2AuthorizationServerConfigurer;
|
||||||
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
|
|
||||||
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.ProviderSettings;
|
import org.springframework.security.oauth2.server.authorization.config.ProviderSettings;
|
||||||
@@ -69,12 +68,10 @@ public class OAuth2AuthorizationServerConfiguration {
|
|||||||
authorizeRequests.anyRequest().authenticated()
|
authorizeRequests.anyRequest().authenticated()
|
||||||
)
|
)
|
||||||
.csrf(csrf -> csrf.ignoringRequestMatchers(endpointsMatcher))
|
.csrf(csrf -> csrf.ignoringRequestMatchers(endpointsMatcher))
|
||||||
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
|
|
||||||
.apply(authorizationServerConfigurer);
|
.apply(authorizationServerConfigurer);
|
||||||
}
|
}
|
||||||
// @formatter:on
|
// @formatter:on
|
||||||
|
|
||||||
@Bean
|
|
||||||
public static JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
|
public static JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
|
||||||
Set<JWSAlgorithm> jwsAlgs = new HashSet<>();
|
Set<JWSAlgorithm> jwsAlgs = new HashSet<>();
|
||||||
jwsAlgs.addAll(JWSAlgorithm.Family.RSA);
|
jwsAlgs.addAll(JWSAlgorithm.Family.RSA);
|
||||||
|
|||||||
@@ -38,8 +38,12 @@ abstract class AbstractOAuth2Configurer {
|
|||||||
|
|
||||||
abstract RequestMatcher getRequestMatcher();
|
abstract RequestMatcher getRequestMatcher();
|
||||||
|
|
||||||
protected <T> T postProcess(T object) {
|
protected final <T> T postProcess(T object) {
|
||||||
return (T) this.objectPostProcessor.postProcess(object);
|
return (T) this.objectPostProcessor.postProcess(object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected final ObjectPostProcessor<Object> getObjectPostProcessor() {
|
||||||
|
return this.objectPostProcessor;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,77 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2020-2021 the original author or authors.
|
||||||
|
*
|
||||||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
* you may not use this file except in compliance with the License.
|
||||||
|
* You may obtain a copy of the License at
|
||||||
|
*
|
||||||
|
* https://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
*
|
||||||
|
* Unless required by applicable law or agreed to in writing, software
|
||||||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
* See the License for the specific language governing permissions and
|
||||||
|
* limitations under the License.
|
||||||
|
*/
|
||||||
|
package org.springframework.security.config.annotation.web.configurers.oauth2.server.authorization;
|
||||||
|
|
||||||
|
import org.springframework.http.HttpMethod;
|
||||||
|
import org.springframework.security.authentication.AuthenticationManager;
|
||||||
|
import org.springframework.security.config.annotation.ObjectPostProcessor;
|
||||||
|
import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
|
||||||
|
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.web.access.intercept.FilterSecurityInterceptor;
|
||||||
|
import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
||||||
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configurer for OpenID Connect Dynamic Client Registration 1.0 Endpoint.
|
||||||
|
*
|
||||||
|
* @author Joe Grandja
|
||||||
|
* @since 0.2.0
|
||||||
|
* @see OidcConfigurer#clientRegistrationEndpoint
|
||||||
|
* @see OidcClientRegistrationEndpointFilter
|
||||||
|
*/
|
||||||
|
public final class OidcClientRegistrationEndpointConfigurer extends AbstractOAuth2Configurer {
|
||||||
|
private RequestMatcher requestMatcher;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restrict for internal use only.
|
||||||
|
*/
|
||||||
|
OidcClientRegistrationEndpointConfigurer(ObjectPostProcessor<Object> objectPostProcessor) {
|
||||||
|
super(objectPostProcessor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
<B extends HttpSecurityBuilder<B>> void init(B builder) {
|
||||||
|
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder);
|
||||||
|
this.requestMatcher = new AntPathRequestMatcher(
|
||||||
|
providerSettings.getOidcClientRegistrationEndpoint(), HttpMethod.POST.name());
|
||||||
|
|
||||||
|
OidcClientRegistrationAuthenticationProvider oidcClientRegistrationAuthenticationProvider =
|
||||||
|
new OidcClientRegistrationAuthenticationProvider(
|
||||||
|
OAuth2ConfigurerUtils.getRegisteredClientRepository(builder),
|
||||||
|
OAuth2ConfigurerUtils.getAuthorizationService(builder));
|
||||||
|
builder.authenticationProvider(postProcess(oidcClientRegistrationAuthenticationProvider));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
<B extends HttpSecurityBuilder<B>> void configure(B builder) {
|
||||||
|
AuthenticationManager authenticationManager = builder.getSharedObject(AuthenticationManager.class);
|
||||||
|
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder);
|
||||||
|
|
||||||
|
OidcClientRegistrationEndpointFilter oidcClientRegistrationEndpointFilter =
|
||||||
|
new OidcClientRegistrationEndpointFilter(
|
||||||
|
authenticationManager,
|
||||||
|
providerSettings.getOidcClientRegistrationEndpoint());
|
||||||
|
builder.addFilterAfter(postProcess(oidcClientRegistrationEndpointFilter), FilterSecurityInterceptor.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
RequestMatcher getRequestMatcher() {
|
||||||
|
return this.requestMatcher;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,14 +19,11 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.http.HttpMethod;
|
import org.springframework.http.HttpMethod;
|
||||||
import org.springframework.security.authentication.AuthenticationManager;
|
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.HttpSecurityBuilder;
|
import org.springframework.security.config.annotation.web.HttpSecurityBuilder;
|
||||||
import org.springframework.security.oauth2.server.authorization.config.ProviderSettings;
|
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.oidc.web.OidcProviderConfigurationEndpointFilter;
|
||||||
import org.springframework.security.web.access.intercept.FilterSecurityInterceptor;
|
|
||||||
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;
|
||||||
@@ -38,10 +35,11 @@ import org.springframework.security.web.util.matcher.RequestMatcher;
|
|||||||
* @author Joe Grandja
|
* @author Joe Grandja
|
||||||
* @since 0.2.0
|
* @since 0.2.0
|
||||||
* @see OAuth2AuthorizationServerConfigurer#oidc
|
* @see OAuth2AuthorizationServerConfigurer#oidc
|
||||||
|
* @see OidcClientRegistrationEndpointConfigurer
|
||||||
* @see OidcProviderConfigurationEndpointFilter
|
* @see OidcProviderConfigurationEndpointFilter
|
||||||
* @see OidcClientRegistrationEndpointFilter
|
|
||||||
*/
|
*/
|
||||||
public final class OidcConfigurer extends AbstractOAuth2Configurer {
|
public final class OidcConfigurer extends AbstractOAuth2Configurer {
|
||||||
|
private OidcClientRegistrationEndpointConfigurer clientRegistrationEndpointConfigurer;
|
||||||
private RequestMatcher requestMatcher;
|
private RequestMatcher requestMatcher;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -51,47 +49,50 @@ public final class OidcConfigurer extends AbstractOAuth2Configurer {
|
|||||||
super(objectPostProcessor);
|
super(objectPostProcessor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configures the OpenID Connect Dynamic Client Registration 1.0 Endpoint.
|
||||||
|
*
|
||||||
|
* @param clientRegistrationEndpointCustomizer the {@link Customizer} providing access to the {@link OidcClientRegistrationEndpointConfigurer}
|
||||||
|
* @return the {@link OidcConfigurer} for further configuration
|
||||||
|
*/
|
||||||
|
public OidcConfigurer clientRegistrationEndpoint(Customizer<OidcClientRegistrationEndpointConfigurer> clientRegistrationEndpointCustomizer) {
|
||||||
|
if (this.clientRegistrationEndpointConfigurer == null) {
|
||||||
|
this.clientRegistrationEndpointConfigurer = new OidcClientRegistrationEndpointConfigurer(getObjectPostProcessor());
|
||||||
|
}
|
||||||
|
clientRegistrationEndpointCustomizer.customize(this.clientRegistrationEndpointConfigurer);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
<B extends HttpSecurityBuilder<B>> void init(B builder) {
|
<B extends HttpSecurityBuilder<B>> void init(B builder) {
|
||||||
|
if (this.clientRegistrationEndpointConfigurer != null) {
|
||||||
|
this.clientRegistrationEndpointConfigurer.init(builder);
|
||||||
|
}
|
||||||
|
|
||||||
List<RequestMatcher> requestMatchers = new ArrayList<>();
|
List<RequestMatcher> requestMatchers = new ArrayList<>();
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder);
|
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder);
|
||||||
if (providerSettings.getIssuer() != null) {
|
if (providerSettings.getIssuer() != null) {
|
||||||
requestMatchers.add(
|
requestMatchers.add(new AntPathRequestMatcher(
|
||||||
new AntPathRequestMatcher(
|
"/.well-known/openid-configuration", HttpMethod.GET.name()));
|
||||||
"/.well-known/openid-configuration",
|
|
||||||
HttpMethod.GET.name()));
|
|
||||||
}
|
}
|
||||||
requestMatchers.add(
|
if (this.clientRegistrationEndpointConfigurer != null) {
|
||||||
new AntPathRequestMatcher(
|
requestMatchers.add(this.clientRegistrationEndpointConfigurer.getRequestMatcher());
|
||||||
providerSettings.getOidcClientRegistrationEndpoint(),
|
}
|
||||||
HttpMethod.POST.name()));
|
this.requestMatcher = !requestMatchers.isEmpty() ? new OrRequestMatcher(requestMatchers) : request -> false;
|
||||||
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
|
@Override
|
||||||
<B extends HttpSecurityBuilder<B>> void configure(B builder) {
|
<B extends HttpSecurityBuilder<B>> void configure(B builder) {
|
||||||
|
if (this.clientRegistrationEndpointConfigurer != null) {
|
||||||
|
this.clientRegistrationEndpointConfigurer.configure(builder);
|
||||||
|
}
|
||||||
|
|
||||||
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder);
|
ProviderSettings providerSettings = OAuth2ConfigurerUtils.getProviderSettings(builder);
|
||||||
if (providerSettings.getIssuer() != null) {
|
if (providerSettings.getIssuer() != null) {
|
||||||
OidcProviderConfigurationEndpointFilter oidcProviderConfigurationEndpointFilter =
|
OidcProviderConfigurationEndpointFilter oidcProviderConfigurationEndpointFilter =
|
||||||
new OidcProviderConfigurationEndpointFilter(providerSettings);
|
new OidcProviderConfigurationEndpointFilter(providerSettings);
|
||||||
builder.addFilterBefore(postProcess(oidcProviderConfigurationEndpointFilter), AbstractPreAuthenticatedProcessingFilter.class);
|
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
|
@Override
|
||||||
|
|||||||
@@ -61,6 +61,7 @@ import org.springframework.security.core.GrantedAuthority;
|
|||||||
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
||||||
|
import org.springframework.security.oauth2.core.OAuth2AuthorizationCode;
|
||||||
import org.springframework.security.oauth2.core.OAuth2TokenType;
|
import org.springframework.security.oauth2.core.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
|
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
|
||||||
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
||||||
@@ -76,7 +77,6 @@ import org.springframework.security.oauth2.server.authorization.JdbcOAuth2Author
|
|||||||
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.JwtEncodingContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
|
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
|
||||||
import org.springframework.security.oauth2.core.OAuth2AuthorizationCode;
|
|
||||||
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.OAuth2TokenCustomizer;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenCustomizer;
|
||||||
@@ -601,6 +601,11 @@ public class OAuth2AuthorizationCodeGrantTests {
|
|||||||
return jwkSource;
|
return jwkSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
|
||||||
|
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer() {
|
OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer() {
|
||||||
return context -> {
|
return context -> {
|
||||||
|
|||||||
@@ -30,7 +30,6 @@ import org.junit.Test;
|
|||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.context.annotation.Bean;
|
import org.springframework.context.annotation.Bean;
|
||||||
import org.springframework.context.annotation.Import;
|
|
||||||
import org.springframework.http.HttpHeaders;
|
import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
@@ -43,8 +42,11 @@ import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
|
|||||||
import org.springframework.mock.http.MockHttpOutputMessage;
|
import org.springframework.mock.http.MockHttpOutputMessage;
|
||||||
import org.springframework.mock.http.client.MockClientHttpResponse;
|
import org.springframework.mock.http.client.MockClientHttpResponse;
|
||||||
import org.springframework.mock.web.MockHttpServletResponse;
|
import org.springframework.mock.web.MockHttpServletResponse;
|
||||||
|
import org.springframework.security.config.Customizer;
|
||||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
||||||
import org.springframework.security.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
import org.springframework.security.config.annotation.web.configuration.OAuth2AuthorizationServerConfiguration;
|
||||||
|
import org.springframework.security.config.annotation.web.configurers.oauth2.server.resource.OAuth2ResourceServerConfigurer;
|
||||||
import org.springframework.security.config.test.SpringTestRule;
|
import org.springframework.security.config.test.SpringTestRule;
|
||||||
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
@@ -59,11 +61,14 @@ import org.springframework.security.oauth2.core.oidc.OidcClientRegistration;
|
|||||||
import org.springframework.security.oauth2.core.oidc.http.converter.OidcClientRegistrationHttpMessageConverter;
|
import org.springframework.security.oauth2.core.oidc.http.converter.OidcClientRegistrationHttpMessageConverter;
|
||||||
import org.springframework.security.oauth2.jose.TestJwks;
|
import org.springframework.security.oauth2.jose.TestJwks;
|
||||||
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
|
import org.springframework.security.oauth2.jose.jws.SignatureAlgorithm;
|
||||||
|
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository.RegisteredClientParametersMapper;
|
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository.RegisteredClientParametersMapper;
|
||||||
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.web.SecurityFilterChain;
|
||||||
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
||||||
import org.springframework.test.web.servlet.MockMvc;
|
import org.springframework.test.web.servlet.MockMvc;
|
||||||
import org.springframework.test.web.servlet.MvcResult;
|
import org.springframework.test.web.servlet.MvcResult;
|
||||||
|
|
||||||
@@ -223,9 +228,30 @@ public class OidcClientRegistrationTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@EnableWebSecurity
|
@EnableWebSecurity
|
||||||
@Import(OAuth2AuthorizationServerConfiguration.class)
|
|
||||||
static class AuthorizationServerConfiguration {
|
static class AuthorizationServerConfiguration {
|
||||||
|
|
||||||
|
// @formatter:off
|
||||||
|
@Bean
|
||||||
|
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
|
||||||
|
OAuth2AuthorizationServerConfigurer<HttpSecurity> authorizationServerConfigurer =
|
||||||
|
new OAuth2AuthorizationServerConfigurer<>();
|
||||||
|
authorizationServerConfigurer
|
||||||
|
.oidc(oidc ->
|
||||||
|
oidc.clientRegistrationEndpoint(Customizer.withDefaults()));
|
||||||
|
RequestMatcher endpointsMatcher = authorizationServerConfigurer.getEndpointsMatcher();
|
||||||
|
|
||||||
|
http
|
||||||
|
.requestMatcher(endpointsMatcher)
|
||||||
|
.authorizeRequests(authorizeRequests ->
|
||||||
|
authorizeRequests.anyRequest().authenticated()
|
||||||
|
)
|
||||||
|
.csrf(csrf -> csrf.ignoringRequestMatchers(endpointsMatcher))
|
||||||
|
.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt)
|
||||||
|
.apply(authorizationServerConfigurer);
|
||||||
|
return http.build();
|
||||||
|
}
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
RegisteredClientRepository registeredClientRepository(JdbcOperations jdbcOperations, PasswordEncoder passwordEncoder) {
|
RegisteredClientRepository registeredClientRepository(JdbcOperations jdbcOperations, PasswordEncoder passwordEncoder) {
|
||||||
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
|
RegisteredClient registeredClient = TestRegisteredClients.registeredClient().build();
|
||||||
@@ -247,10 +273,16 @@ public class OidcClientRegistrationTests {
|
|||||||
return jwkSource;
|
return jwkSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
|
||||||
|
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
PasswordEncoder passwordEncoder() {
|
PasswordEncoder passwordEncoder() {
|
||||||
return NoOpPasswordEncoder.getInstance();
|
return NoOpPasswordEncoder.getInstance();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,6 +56,7 @@ import org.springframework.security.core.GrantedAuthority;
|
|||||||
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
|
||||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||||
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
||||||
|
import org.springframework.security.oauth2.core.OAuth2AuthorizationCode;
|
||||||
import org.springframework.security.oauth2.core.OAuth2TokenType;
|
import org.springframework.security.oauth2.core.OAuth2TokenType;
|
||||||
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
|
import org.springframework.security.oauth2.core.endpoint.OAuth2AccessTokenResponse;
|
||||||
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
import org.springframework.security.oauth2.core.endpoint.OAuth2AuthorizationResponseType;
|
||||||
@@ -69,7 +70,6 @@ import org.springframework.security.oauth2.jwt.JwtDecoder;
|
|||||||
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.JwtEncodingContext;
|
import org.springframework.security.oauth2.server.authorization.JwtEncodingContext;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
|
import org.springframework.security.oauth2.server.authorization.OAuth2Authorization;
|
||||||
import org.springframework.security.oauth2.core.OAuth2AuthorizationCode;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2TokenCustomizer;
|
import org.springframework.security.oauth2.server.authorization.OAuth2TokenCustomizer;
|
||||||
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;
|
import org.springframework.security.oauth2.server.authorization.client.JdbcRegisteredClientRepository;
|
||||||
@@ -294,6 +294,11 @@ public class OidcTests {
|
|||||||
return jwkSource;
|
return jwkSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
|
||||||
|
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
|
||||||
|
}
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer() {
|
OAuth2TokenCustomizer<JwtEncodingContext> jwtCustomizer() {
|
||||||
return context -> {
|
return context -> {
|
||||||
|
|||||||
@@ -37,7 +37,6 @@ import org.springframework.security.config.annotation.web.configuration.OAuth2Au
|
|||||||
import org.springframework.security.oauth2.core.AuthorizationGrantType;
|
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.oidc.OidcScopes;
|
import org.springframework.security.oauth2.core.oidc.OidcScopes;
|
||||||
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
|
||||||
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationConsentService;
|
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationConsentService;
|
||||||
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
import org.springframework.security.oauth2.server.authorization.JdbcOAuth2AuthorizationService;
|
||||||
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
|
import org.springframework.security.oauth2.server.authorization.OAuth2AuthorizationConsentService;
|
||||||
@@ -106,11 +105,6 @@ public class AuthorizationServerConfig {
|
|||||||
return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
|
return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Bean
|
|
||||||
public JwtDecoder jwtDecoder(JWKSource<SecurityContext> jwkSource) {
|
|
||||||
return OAuth2AuthorizationServerConfiguration.jwtDecoder(jwkSource);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Bean
|
@Bean
|
||||||
public ProviderSettings providerSettings() {
|
public ProviderSettings providerSettings() {
|
||||||
return ProviderSettings.builder().issuer("http://auth-server:9000").build();
|
return ProviderSettings.builder().issuer("http://auth-server:9000").build();
|
||||||
|
|||||||
Reference in New Issue
Block a user