Skip to content

Commit 2b3d419

Browse files
committed
Add FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER constant
All the filters added explicitly by Spring Boot now have order <= FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER (value 0). There is nothing we can do about the DispatcherServlet and anything else downstream of the filter chain. Fixes spring-projectsgh-3613
1 parent 3800729 commit 2b3d419

File tree

8 files changed

+44
-34
lines changed

8 files changed

+44
-34
lines changed

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/AuthenticationManagerConfiguration.java

+6-5
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ public class AuthenticationManagerConfiguration {
6969
private static Log logger = LogFactory
7070
.getLog(AuthenticationManagerConfiguration.class);
7171

72+
@SuppressWarnings("unused")
7273
@Autowired
7374
private List<SecurityPrerequisite> dependencies;
7475

@@ -111,7 +112,7 @@ public static SpringBootAuthenticationConfigurerAdapter springBootAuthentication
111112
*/
112113
@Order(Ordered.LOWEST_PRECEDENCE - 100)
113114
private static class SpringBootAuthenticationConfigurerAdapter extends
114-
GlobalAuthenticationConfigurerAdapter {
115+
GlobalAuthenticationConfigurerAdapter {
115116

116117
private final SecurityProperties securityProperties;
117118

@@ -151,7 +152,7 @@ public void init(AuthenticationManagerBuilder auth) throws Exception {
151152
* </ul>
152153
*/
153154
private static class DefaultInMemoryUserDetailsManagerConfigurer extends
154-
InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> {
155+
InMemoryUserDetailsManagerConfigurer<AuthenticationManagerBuilder> {
155156

156157
private final SecurityProperties securityProperties;
157158

@@ -168,7 +169,7 @@ public void configure(AuthenticationManagerBuilder auth) throws Exception {
168169
User user = this.securityProperties.getUser();
169170
if (user.isDefaultPassword()) {
170171
logger.info("\n\nUsing default security password: " + user.getPassword()
171-
+ "\n");
172+
+ "\n");
172173
}
173174
Set<String> roles = new LinkedHashSet<String>(user.getRole());
174175
withUser(user.getName()).password(user.getPassword()).roles(
@@ -196,7 +197,7 @@ private void setField(Object target, String name, Object value) {
196197
*/
197198
@Component
198199
protected static class AuthenticationManagerConfigurationListener implements
199-
SmartInitializingSingleton {
200+
SmartInitializingSingleton {
200201

201202
@Autowired
202203
private AuthenticationEventPublisher eventPublisher;
@@ -218,7 +219,7 @@ public void afterSingletonsInstantiated() {
218219
private void configureAuthenticationManager(AuthenticationManager manager) {
219220
if (manager instanceof ProviderManager) {
220221
((ProviderManager) manager)
221-
.setAuthenticationEventPublisher(this.eventPublisher);
222+
.setAuthenticationEventPublisher(this.eventPublisher);
222223
}
223224
}
224225

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/security/SecurityProperties.java

+8-3
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import java.util.List;
2222
import java.util.UUID;
2323

24+
import org.springframework.boot.context.embedded.FilterRegistrationBean;
2425
import org.springframework.boot.context.properties.ConfigurationProperties;
2526
import org.springframework.core.Ordered;
2627
import org.springframework.security.config.http.SessionCreationPolicy;
@@ -39,7 +40,8 @@ public class SecurityProperties implements SecurityPrerequisite {
3940
* useful place to put user-defined access rules if you want to override the default
4041
* access rules.
4142
*/
42-
public static final int ACCESS_OVERRIDE_ORDER = SecurityProperties.BASIC_AUTH_ORDER - 2;
43+
public static final int ACCESS_OVERRIDE_ORDER = SecurityProperties.BASIC_AUTH_ORDER
44+
- 2;
4345

4446
/**
4547
* Order applied to the WebSecurityConfigurerAdapter that is used to configure basic
@@ -56,9 +58,12 @@ public class SecurityProperties implements SecurityPrerequisite {
5658
public static final int IGNORED_ORDER = Ordered.HIGHEST_PRECEDENCE;
5759

5860
/**
59-
* Default order of Spring Security's Filter.
61+
* Default order of Spring Security's Filter in the servlet container (i.e. amongst
62+
* other filters registered with the container). There is no connection between this
63+
* and the <code>@Order</code> on a WebSecurityConfigurer.
6064
*/
61-
public static final int DEFAULT_FILTER_ORDER = 0;
65+
public static final int DEFAULT_FILTER_ORDER = FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER
66+
- 100;
6267

6368
/**
6469
* Enable secure channel for all requests.

spring-boot-autoconfigure/src/main/java/org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration.java

+2-6
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,6 @@
4949
import org.springframework.core.convert.converter.Converter;
5050
import org.springframework.core.convert.converter.GenericConverter;
5151
import org.springframework.core.io.Resource;
52-
import org.springframework.core.io.ResourceLoader;
5352
import org.springframework.format.Formatter;
5453
import org.springframework.format.FormatterRegistry;
5554
import org.springframework.format.datetime.DateFormatter;
@@ -97,7 +96,7 @@
9796
@Configuration
9897
@ConditionalOnWebApplication
9998
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class,
100-
WebMvcConfigurerAdapter.class })
99+
WebMvcConfigurerAdapter.class })
101100
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
102101
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
103102
@AutoConfigureAfter(DispatcherServletAutoConfiguration.class)
@@ -137,9 +136,6 @@ public static class WebMvcAutoConfigurationAdapter extends WebMvcConfigurerAdapt
137136
@Autowired
138137
private ListableBeanFactory beanFactory;
139138

140-
@Autowired
141-
private ResourceLoader resourceLoader;
142-
143139
@Autowired
144140
private HttpMessageConverters messageConverters;
145141

@@ -317,7 +313,7 @@ public SimpleUrlHandlerMapping faviconHandlerMapping() {
317313
public ResourceHttpRequestHandler faviconRequestHandler() {
318314
ResourceHttpRequestHandler requestHandler = new ResourceHttpRequestHandler();
319315
requestHandler
320-
.setLocations(this.resourceProperties.getFaviconLocations());
316+
.setLocations(this.resourceProperties.getFaviconLocations());
321317
return requestHandler;
322318
}
323319

spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/security/SecurityAutoConfigurationTests.java

+12-12
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,12 @@
1616

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

19+
import static org.junit.Assert.assertEquals;
20+
import static org.junit.Assert.assertFalse;
21+
import static org.junit.Assert.assertNotNull;
22+
import static org.junit.Assert.assertTrue;
23+
import static org.junit.Assert.fail;
24+
1925
import java.util.List;
2026

2127
import org.junit.After;
@@ -57,12 +63,6 @@
5763
import org.springframework.security.web.SecurityFilterChain;
5864
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
5965

60-
import static org.junit.Assert.assertEquals;
61-
import static org.junit.Assert.assertFalse;
62-
import static org.junit.Assert.assertNotNull;
63-
import static org.junit.Assert.assertTrue;
64-
import static org.junit.Assert.fail;
65-
6666
/**
6767
* Tests for {@link SecurityAutoConfiguration}.
6868
*
@@ -105,7 +105,7 @@ public void testDefaultFilterOrderWithSecurityAdapter() throws Exception {
105105
PropertyPlaceholderAutoConfiguration.class);
106106
this.context.refresh();
107107
assertEquals(
108-
0,
108+
FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER-100,
109109
this.context.getBean("securityFilterChainRegistration",
110110
FilterRegistrationBean.class).getOrder());
111111
}
@@ -136,7 +136,7 @@ public void testDefaultFilterOrder() throws Exception {
136136
PropertyPlaceholderAutoConfiguration.class);
137137
this.context.refresh();
138138
assertEquals(
139-
0,
139+
FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER-100,
140140
this.context.getBean("securityFilterChainRegistration",
141141
FilterRegistrationBean.class).getOrder());
142142
}
@@ -364,7 +364,7 @@ public void testSecurityEvaluationContextExtensionSupport() {
364364
}
365365

366366
private static final class AuthenticationListener implements
367-
ApplicationListener<AbstractAuthenticationEvent> {
367+
ApplicationListener<AbstractAuthenticationEvent> {
368368

369369
private ApplicationEvent event;
370370

@@ -410,7 +410,7 @@ protected static class SecurityCustomizer extends WebSecurityConfigurerAdapter {
410410

411411
@Configuration
412412
protected static class WorkaroundSecurityCustomizer extends
413-
WebSecurityConfigurerAdapter {
413+
WebSecurityConfigurerAdapter {
414414

415415
@Autowired
416416
private AuthenticationManagerBuilder builder;
@@ -435,7 +435,7 @@ public Authentication authenticate(Authentication authentication)
435435
@Configuration
436436
@Order(-1)
437437
protected static class AuthenticationManagerCustomizer extends
438-
GlobalAuthenticationConfigurerAdapter {
438+
GlobalAuthenticationConfigurerAdapter {
439439

440440
@Override
441441
public void init(AuthenticationManagerBuilder auth) throws Exception {
@@ -446,7 +446,7 @@ public void init(AuthenticationManagerBuilder auth) throws Exception {
446446

447447
@Configuration
448448
protected static class UserDetailsSecurityCustomizer extends
449-
WebSecurityConfigurerAdapter {
449+
WebSecurityConfigurerAdapter {
450450

451451
private UserDetailsService userDetails;
452452

spring-boot/src/main/java/org/springframework/boot/context/embedded/FilterRegistrationBean.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
*/
5252
public class FilterRegistrationBean extends RegistrationBean {
5353

54+
/**
55+
* Filters that wrap the servlet request should have an order less than or equal to this.
56+
*/
57+
public static final int REQUEST_WRAPPER_FILTER_MAX_ORDER = 0;
58+
5459
private static Log logger = LogFactory.getLog(FilterRegistrationBean.class);
5560

5661
static final EnumSet<DispatcherType> ASYNC_DISPATCHER_TYPES = EnumSet.of(
@@ -291,7 +296,7 @@ protected void configure(FilterRegistration.Dynamic registration) {
291296
else {
292297
if (servletNames.size() > 0) {
293298
logger.info("Mapping filter: '" + registration.getName()
294-
+ "' to servlets: " + servletNames);
299+
+ "' to servlets: " + servletNames);
295300
registration.addMappingForServletNames(dispatcherTypes, this.matchAfter,
296301
servletNames.toArray(new String[servletNames.size()]));
297302
}

spring-boot/src/main/java/org/springframework/boot/context/web/OrderedCharacterEncodingFilter.java

+4-3
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.context.web;
1818

19+
import org.springframework.boot.context.embedded.FilterRegistrationBean;
1920
import org.springframework.core.Ordered;
2021
import org.springframework.web.filter.CharacterEncodingFilter;
2122

@@ -25,10 +26,10 @@
2526
* @author Phillip Webb
2627
* @since 1.2.1
2728
*/
28-
public class OrderedCharacterEncodingFilter extends CharacterEncodingFilter implements
29-
Ordered {
29+
public class OrderedCharacterEncodingFilter extends CharacterEncodingFilter
30+
implements Ordered {
3031

31-
private int order = Ordered.HIGHEST_PRECEDENCE;
32+
private int order = FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 9800;
3233

3334
@Override
3435
public int getOrder() {

spring-boot/src/main/java/org/springframework/boot/context/web/OrderedHiddenHttpMethodFilter.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.context.web;
1818

19+
import org.springframework.boot.context.embedded.FilterRegistrationBean;
1920
import org.springframework.core.Ordered;
2021
import org.springframework.web.filter.HiddenHttpMethodFilter;
2122

@@ -26,12 +27,12 @@
2627
* @since 1.2.4
2728
*/
2829
public class OrderedHiddenHttpMethodFilter extends HiddenHttpMethodFilter implements
29-
Ordered {
30+
Ordered {
3031

3132
/**
3233
* The default order is high to ensure the filter is applied before Spring Security.
3334
*/
34-
public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 10;
35+
public static final int DEFAULT_ORDER = FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 10000;
3536

3637
private int order = DEFAULT_ORDER;
3738

spring-boot/src/main/java/org/springframework/boot/context/web/OrderedHttpPutFormContentFilter.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.boot.context.web;
1818

19+
import org.springframework.boot.context.embedded.FilterRegistrationBean;
1920
import org.springframework.core.Ordered;
2021
import org.springframework.web.filter.HttpPutFormContentFilter;
2122

@@ -26,12 +27,12 @@
2627
* @since 1.3.0
2728
*/
2829
public class OrderedHttpPutFormContentFilter extends HttpPutFormContentFilter implements
29-
Ordered {
30+
Ordered {
3031

3132
/**
3233
* Higher order to ensure the filter is applied before Spring Security.
3334
*/
34-
public static final int DEFAULT_ORDER = Ordered.HIGHEST_PRECEDENCE + 10;
35+
public static final int DEFAULT_ORDER = FilterRegistrationBean.REQUEST_WRAPPER_FILTER_MAX_ORDER - 9900;
3536

3637
private int order = DEFAULT_ORDER;
3738

0 commit comments

Comments
 (0)