Streamline OAuth2 resource server auto-config class conditions
Fixes gh-22233
This commit is contained in:
@@ -17,6 +17,7 @@ package org.springframework.boot.autoconfigure.security.oauth2.resource.servlet;
|
|||||||
|
|
||||||
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
|
||||||
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
|
||||||
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
||||||
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
|
||||||
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties;
|
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties;
|
||||||
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
|
import org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration;
|
||||||
@@ -24,6 +25,7 @@ import org.springframework.boot.autoconfigure.security.servlet.UserDetailsServic
|
|||||||
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
import org.springframework.boot.context.properties.EnableConfigurationProperties;
|
||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
|
import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link EnableAutoConfiguration Auto-configuration} for OAuth2 resource server support.
|
* {@link EnableAutoConfiguration Auto-configuration} for OAuth2 resource server support.
|
||||||
@@ -34,6 +36,7 @@ import org.springframework.context.annotation.Import;
|
|||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
@AutoConfigureBefore({ SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class })
|
@AutoConfigureBefore({ SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class })
|
||||||
@EnableConfigurationProperties(OAuth2ResourceServerProperties.class)
|
@EnableConfigurationProperties(OAuth2ResourceServerProperties.class)
|
||||||
|
@ConditionalOnClass(BearerTokenAuthenticationToken.class)
|
||||||
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
|
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
|
||||||
@Import({ Oauth2ResourceServerConfiguration.JwtConfiguration.class,
|
@Import({ Oauth2ResourceServerConfiguration.JwtConfiguration.class,
|
||||||
Oauth2ResourceServerConfiguration.OpaqueTokenConfiguration.class })
|
Oauth2ResourceServerConfiguration.OpaqueTokenConfiguration.class })
|
||||||
|
|||||||
@@ -20,9 +20,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
|
|||||||
import org.springframework.context.annotation.Configuration;
|
import org.springframework.context.annotation.Configuration;
|
||||||
import org.springframework.context.annotation.Import;
|
import org.springframework.context.annotation.Import;
|
||||||
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
import org.springframework.security.oauth2.jwt.JwtDecoder;
|
||||||
import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken;
|
|
||||||
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
|
||||||
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Configuration classes for OAuth2 Resource Server These should be {@code @Import} in a
|
* Configuration classes for OAuth2 Resource Server These should be {@code @Import} in a
|
||||||
@@ -33,7 +30,7 @@ import org.springframework.security.oauth2.server.resource.introspection.OpaqueT
|
|||||||
class Oauth2ResourceServerConfiguration {
|
class Oauth2ResourceServerConfiguration {
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
@ConditionalOnClass({ JwtAuthenticationToken.class, JwtDecoder.class })
|
@ConditionalOnClass(JwtDecoder.class)
|
||||||
@Import({ OAuth2ResourceServerJwtConfiguration.JwtDecoderConfiguration.class,
|
@Import({ OAuth2ResourceServerJwtConfiguration.JwtDecoderConfiguration.class,
|
||||||
OAuth2ResourceServerJwtConfiguration.OAuth2WebSecurityConfigurerAdapter.class })
|
OAuth2ResourceServerJwtConfiguration.OAuth2WebSecurityConfigurerAdapter.class })
|
||||||
static class JwtConfiguration {
|
static class JwtConfiguration {
|
||||||
@@ -41,7 +38,6 @@ class Oauth2ResourceServerConfiguration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Configuration(proxyBeanMethods = false)
|
@Configuration(proxyBeanMethods = false)
|
||||||
@ConditionalOnClass({ BearerTokenAuthenticationToken.class, OpaqueTokenIntrospector.class })
|
|
||||||
@Import({ OAuth2ResourceServerOpaqueTokenConfiguration.OpaqueTokenIntrospectionClientConfiguration.class,
|
@Import({ OAuth2ResourceServerOpaqueTokenConfiguration.OpaqueTokenIntrospectionClientConfiguration.class,
|
||||||
OAuth2ResourceServerOpaqueTokenConfiguration.OAuth2WebSecurityConfigurerAdapter.class })
|
OAuth2ResourceServerOpaqueTokenConfiguration.OAuth2WebSecurityConfigurerAdapter.class })
|
||||||
static class OpaqueTokenConfiguration {
|
static class OpaqueTokenConfiguration {
|
||||||
|
|||||||
@@ -50,7 +50,6 @@ import org.springframework.security.oauth2.jwt.JwtDecoder;
|
|||||||
import org.springframework.security.oauth2.jwt.JwtIssuerValidator;
|
import org.springframework.security.oauth2.jwt.JwtIssuerValidator;
|
||||||
import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken;
|
import org.springframework.security.oauth2.server.resource.BearerTokenAuthenticationToken;
|
||||||
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationProvider;
|
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationProvider;
|
||||||
import org.springframework.security.oauth2.server.resource.authentication.JwtAuthenticationToken;
|
|
||||||
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
|
import org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector;
|
||||||
import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter;
|
import org.springframework.security.oauth2.server.resource.web.BearerTokenAuthenticationFilter;
|
||||||
import org.springframework.security.web.FilterChainProxy;
|
import org.springframework.security.web.FilterChainProxy;
|
||||||
@@ -262,21 +261,25 @@ class OAuth2ResourceServerAutoConfigurationTests {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void autoConfigurationShouldBeConditionalOnJwtAuthenticationTokenClass() {
|
void autoConfigurationShouldBeConditionalOnResourceServerClass() {
|
||||||
this.contextRunner
|
this.contextRunner
|
||||||
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://jwk-set-uri.com")
|
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://jwk-set-uri.com")
|
||||||
.withUserConfiguration(JwtDecoderConfig.class)
|
.withUserConfiguration(JwtDecoderConfig.class)
|
||||||
.withClassLoader(new FilteredClassLoader(JwtAuthenticationToken.class))
|
.withClassLoader(new FilteredClassLoader(BearerTokenAuthenticationToken.class)).run((context) -> {
|
||||||
.run((context) -> assertThat(getBearerTokenFilter(context)).isNull());
|
assertThat(context).doesNotHaveBean(OAuth2ResourceServerAutoConfiguration.class);
|
||||||
|
assertThat(getBearerTokenFilter(context)).isNull();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void autoConfigurationShouldBeConditionalOnJwtDecoderClass() {
|
void autoConfigurationForJwtShouldBeConditionalOnJwtDecoderClass() {
|
||||||
this.contextRunner
|
this.contextRunner
|
||||||
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://jwk-set-uri.com")
|
.withPropertyValues("spring.security.oauth2.resourceserver.jwt.jwk-set-uri=https://jwk-set-uri.com")
|
||||||
.withUserConfiguration(JwtDecoderConfig.class)
|
.withUserConfiguration(JwtDecoderConfig.class)
|
||||||
.withClassLoader(new FilteredClassLoader(JwtDecoder.class))
|
.withClassLoader(new FilteredClassLoader(JwtDecoder.class)).run((context) -> {
|
||||||
.run((context) -> assertThat(getBearerTokenFilter(context)).isNull());
|
assertThat(context).hasSingleBean(OAuth2ResourceServerAutoConfiguration.class);
|
||||||
|
assertThat(getBearerTokenFilter(context)).isNull();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user