Skip to content

Commit ef89eb6

Browse files
committed
Add @ConditionalOnDefaultWebSecurity annotation
Add a dedicate condition annotation to detect when Spring Security is available but has not been configured by the user. The new annotation helps simplify quite a few of our auto-configuration classes. See gh-23421
1 parent 0818f27 commit ef89eb6

File tree

8 files changed

+105
-25
lines changed

8 files changed

+105
-25
lines changed

spring-boot-project/spring-boot-actuator-autoconfigure/src/main/java/org/springframework/boot/actuate/autoconfigure/security/servlet/ManagementWebSecurityAutoConfiguration.java

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,8 @@
2424
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2525
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
2626
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
27-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
28-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2927
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
28+
import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity;
3029
import org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration;
3130
import org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration;
3231
import org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration;
@@ -35,24 +34,23 @@
3534
import org.springframework.context.annotation.Configuration;
3635
import org.springframework.security.config.Customizer;
3736
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
38-
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
3937
import org.springframework.security.web.SecurityFilterChain;
4038

4139
/**
4240
* {@link EnableAutoConfiguration Auto-configuration} for Spring Security when actuator is
4341
* on the classpath. It allows unauthenticated access to the {@link HealthEndpoint} and
4442
* {@link InfoEndpoint}. If the user specifies their own
45-
* {@link WebSecurityConfigurerAdapter} or {@link SecurityFilterChain} bean, this will
46-
* back-off completely and the user should specify all the bits that they want to
47-
* configure as part of the custom security configuration.
43+
* {@link org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter
44+
* WebSecurityConfigurerAdapter} or {@link SecurityFilterChain} bean, this will back-off
45+
* completely and the user should specify all the bits that they want to configure as part
46+
* of the custom security configuration.
4847
*
4948
* @author Madhura Bhave
5049
* @since 2.1.0
5150
*/
5251
@Configuration(proxyBeanMethods = false)
53-
@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })
54-
@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })
5552
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
53+
@ConditionalOnDefaultWebSecurity
5654
@AutoConfigureBefore(SecurityAutoConfiguration.class)
5755
@AutoConfigureAfter({ HealthEndpointAutoConfiguration.class, InfoEndpointAutoConfiguration.class,
5856
WebEndpointAutoConfiguration.class, OAuth2ClientAutoConfiguration.class,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
/*
2+
* Copyright 2012-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.security;
18+
19+
import java.lang.annotation.Documented;
20+
import java.lang.annotation.ElementType;
21+
import java.lang.annotation.Retention;
22+
import java.lang.annotation.RetentionPolicy;
23+
import java.lang.annotation.Target;
24+
25+
import org.springframework.context.annotation.Conditional;
26+
27+
/**
28+
* {@link Conditional @Conditional} that only matches when web security is available and
29+
* the user has not defined their own configuration.
30+
*
31+
* @author Phillip Webb
32+
* @since 2.4.0
33+
*/
34+
@Target({ ElementType.TYPE, ElementType.METHOD })
35+
@Retention(RetentionPolicy.RUNTIME)
36+
@Documented
37+
@Conditional(DefaultWebSecurityCondition.class)
38+
public @interface ConditionalOnDefaultWebSecurity {
39+
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* Copyright 2012-2020 the original author or authors.
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* https://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package org.springframework.boot.autoconfigure.security;
18+
19+
import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
20+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
21+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
22+
import org.springframework.context.annotation.Condition;
23+
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
24+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
25+
import org.springframework.security.web.SecurityFilterChain;
26+
27+
/**
28+
* {@link Condition} for
29+
* {@link ConditionalOnDefaultWebSecurity @ConditionalOnDefaultWebSecurity}.
30+
*
31+
* @author Phillip Webb
32+
*/
33+
class DefaultWebSecurityCondition extends AllNestedConditions {
34+
35+
DefaultWebSecurityCondition() {
36+
super(ConfigurationPhase.REGISTER_BEAN);
37+
}
38+
39+
@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })
40+
static class Classes {
41+
42+
}
43+
44+
@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })
45+
static class Beans {
46+
47+
}
48+
49+
}

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/client/servlet/OAuth2WebSecurityConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,8 @@
1717
package org.springframework.boot.autoconfigure.security.oauth2.client.servlet;
1818

1919
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
20-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2120
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
21+
import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity;
2222
import org.springframework.context.annotation.Bean;
2323
import org.springframework.context.annotation.Configuration;
2424
import org.springframework.security.config.Customizer;
@@ -54,8 +54,7 @@ OAuth2AuthorizedClientRepository authorizedClientRepository(OAuth2AuthorizedClie
5454
}
5555

5656
@Configuration(proxyBeanMethods = false)
57-
@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })
58-
@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })
57+
@ConditionalOnDefaultWebSecurity
5958
static class OAuth2SecurityFilterChainConfiguration {
6059

6160
@Bean

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/servlet/OAuth2ResourceServerJwtConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,9 @@
2121
import java.util.Base64;
2222

2323
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
24-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2524
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2625
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
26+
import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity;
2727
import org.springframework.boot.autoconfigure.security.oauth2.resource.IssuerUriCondition;
2828
import org.springframework.boot.autoconfigure.security.oauth2.resource.KeyValueCondition;
2929
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties;
@@ -97,8 +97,7 @@ JwtDecoder jwtDecoderByIssuerUri() {
9797
}
9898

9999
@Configuration(proxyBeanMethods = false)
100-
@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })
101-
@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })
100+
@ConditionalOnDefaultWebSecurity
102101
static class OAuth2SecurityFilterChainConfiguration {
103102

104103
@Bean

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/oauth2/resource/servlet/OAuth2ResourceServerOpaqueTokenConfiguration.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,9 @@
1616
package org.springframework.boot.autoconfigure.security.oauth2.resource.servlet;
1717

1818
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
19-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
2019
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2120
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
21+
import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity;
2222
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties;
2323
import org.springframework.context.annotation.Bean;
2424
import org.springframework.context.annotation.Configuration;
@@ -54,8 +54,7 @@ NimbusOpaqueTokenIntrospector opaqueTokenIntrospector(OAuth2ResourceServerProper
5454
}
5555

5656
@Configuration(proxyBeanMethods = false)
57-
@ConditionalOnClass({ SecurityFilterChain.class, WebSecurityConfigurerAdapter.class })
58-
@ConditionalOnMissingBean({ WebSecurityConfigurerAdapter.class, SecurityFilterChain.class })
57+
@ConditionalOnDefaultWebSecurity
5958
static class OAuth2SecurityFilterChainConfiguration {
6059

6160
@Bean

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/saml2/Saml2LoginConfiguration.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,7 @@
1717
package org.springframework.boot.autoconfigure.security.saml2;
1818

1919
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
20-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
21-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
20+
import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity;
2221
import org.springframework.context.annotation.Bean;
2322
import org.springframework.context.annotation.Configuration;
2423
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -33,9 +32,8 @@
3332
* @author Madhura Bhave
3433
*/
3534
@Configuration(proxyBeanMethods = false)
36-
@ConditionalOnMissingBean({ SecurityFilterChain.class, WebSecurityConfigurerAdapter.class })
35+
@ConditionalOnDefaultWebSecurity
3736
@ConditionalOnBean(RelyingPartyRegistrationRepository.class)
38-
@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })
3937
class Saml2LoginConfiguration {
4038

4139
@Bean

spring-boot-project/spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/servlet/SpringBootWebSecurityConfiguration.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@
1616

1717
package org.springframework.boot.autoconfigure.security.servlet;
1818

19-
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
20-
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
2119
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
2220
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
21+
import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity;
2322
import org.springframework.boot.autoconfigure.security.SecurityProperties;
2423
import org.springframework.context.annotation.Bean;
2524
import org.springframework.context.annotation.Configuration;
@@ -39,8 +38,7 @@
3938
* @author Madhura Bhave
4039
*/
4140
@Configuration(proxyBeanMethods = false)
42-
@ConditionalOnClass({ SecurityFilterChain.class, HttpSecurity.class })
43-
@ConditionalOnMissingBean({ SecurityFilterChain.class, WebSecurityConfigurerAdapter.class })
41+
@ConditionalOnDefaultWebSecurity
4442
@ConditionalOnWebApplication(type = Type.SERVLET)
4543
class SpringBootWebSecurityConfiguration {
4644

0 commit comments

Comments
 (0)