Skip to content

Commit 71acc90

Browse files
committed
Simplify SecurityAutoConfiguration
Closes gh-28851
1 parent 51ccb29 commit 71acc90

File tree

4 files changed

+70
-110
lines changed

4 files changed

+70
-110
lines changed

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

Lines changed: 0 additions & 52 deletions
This file was deleted.

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

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@
4040
@AutoConfiguration
4141
@ConditionalOnClass(DefaultAuthenticationEventPublisher.class)
4242
@EnableConfigurationProperties(SecurityProperties.class)
43-
@Import({ SpringBootWebSecurityConfiguration.class, WebSecurityEnablerConfiguration.class,
44-
SecurityDataConfiguration.class, ErrorPageSecurityFilterConfiguration.class })
43+
@Import({ SpringBootWebSecurityConfiguration.class, SecurityDataConfiguration.class })
4544
public class SecurityAutoConfiguration {
4645

4746
@Bean

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

Lines changed: 69 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -16,38 +16,94 @@
1616

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

19+
import java.util.EnumSet;
20+
21+
import javax.servlet.DispatcherType;
22+
23+
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
24+
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
25+
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
1926
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
2027
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
2128
import org.springframework.boot.autoconfigure.security.ConditionalOnDefaultWebSecurity;
2229
import org.springframework.boot.autoconfigure.security.SecurityProperties;
30+
import org.springframework.boot.web.servlet.FilterRegistrationBean;
31+
import org.springframework.boot.web.servlet.filter.ErrorPageSecurityFilter;
32+
import org.springframework.context.ApplicationContext;
2333
import org.springframework.context.annotation.Bean;
2434
import org.springframework.context.annotation.Configuration;
2535
import org.springframework.core.annotation.Order;
36+
import org.springframework.security.config.BeanIds;
2637
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
38+
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
39+
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
2740
import org.springframework.security.web.SecurityFilterChain;
41+
import org.springframework.security.web.access.WebInvocationPrivilegeEvaluator;
2842

2943
/**
30-
* The default configuration for web security. It relies on Spring Security's
31-
* content-negotiation strategy to determine what sort of authentication to use. If the
32-
* user specifies their own
33-
* {@link org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter}
34-
* or {@link SecurityFilterChain} bean, this will back-off completely and the users should
35-
* specify all the bits that they want to configure as part of the custom security
36-
* configuration.
44+
* {@link Configuration @Configuration} class securing servlet applications.
3745
*
3846
* @author Madhura Bhave
3947
*/
4048
@Configuration(proxyBeanMethods = false)
41-
@ConditionalOnDefaultWebSecurity
4249
@ConditionalOnWebApplication(type = Type.SERVLET)
4350
@SuppressWarnings("deprecation")
4451
class SpringBootWebSecurityConfiguration {
4552

46-
@Bean
47-
@Order(SecurityProperties.BASIC_AUTH_ORDER)
48-
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
49-
http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
50-
return http.build();
53+
/**
54+
* The default configuration for web security. It relies on Spring Security's
55+
* content-negotiation strategy to determine what sort of authentication to use. If
56+
* the user specifies their own {@link WebSecurityConfigurerAdapter} or
57+
* {@link SecurityFilterChain} bean, this will back-off completely and the users
58+
* should specify all the bits that they want to configure as part of the custom
59+
* security configuration.
60+
*/
61+
@Configuration(proxyBeanMethods = false)
62+
@ConditionalOnDefaultWebSecurity
63+
static class SecurityFilterChainConfiguration {
64+
65+
@Bean
66+
@Order(SecurityProperties.BASIC_AUTH_ORDER)
67+
SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {
68+
http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();
69+
return http.build();
70+
}
71+
72+
}
73+
74+
/**
75+
* Configures the {@link ErrorPageSecurityFilter}.
76+
*/
77+
@Configuration(proxyBeanMethods = false)
78+
@ConditionalOnClass(WebInvocationPrivilegeEvaluator.class)
79+
@ConditionalOnBean(WebInvocationPrivilegeEvaluator.class)
80+
static class ErrorPageSecurityFilterConfiguration {
81+
82+
@Bean
83+
FilterRegistrationBean<ErrorPageSecurityFilter> errorPageSecurityFilter(ApplicationContext context) {
84+
FilterRegistrationBean<ErrorPageSecurityFilter> registration = new FilterRegistrationBean<>(
85+
new ErrorPageSecurityFilter(context));
86+
registration.setDispatcherTypes(EnumSet.of(DispatcherType.ERROR));
87+
return registration;
88+
}
89+
90+
}
91+
92+
/**
93+
* Adds the{@link EnableWebSecurity @EnableWebSecurity} annotation if Spring Security
94+
* is on the classpath. This will make sure that the annotation is present with
95+
* default security auto-configuration and also if the user adds custom security and
96+
* forgets to add the annotation. If {@link EnableWebSecurity @EnableWebSecurity} has
97+
* already been added or if a bean with name
98+
* {@value BeanIds#SPRING_SECURITY_FILTER_CHAIN} has been configured by the user, this
99+
* will back-off.
100+
*/
101+
@Configuration(proxyBeanMethods = false)
102+
@ConditionalOnMissingBean(name = BeanIds.SPRING_SECURITY_FILTER_CHAIN)
103+
@ConditionalOnClass(EnableWebSecurity.class)
104+
@EnableWebSecurity
105+
static class WebSecurityEnablerConfiguration {
106+
51107
}
52108

53109
}

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

Lines changed: 0 additions & 43 deletions
This file was deleted.

0 commit comments

Comments
 (0)