Skip to content

Commit e7ee703

Browse files
committed
Consider Order on SecurityFilterChain bean definitions
Closes gh-9154
1 parent d192b3e commit e7ee703

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfiguration.java

-2
Original file line numberDiff line numberDiff line change
@@ -176,13 +176,11 @@ public void setFilterChainProxySecurityConfigurer(ObjectPostProcessor<Object> ob
176176

177177
@Autowired(required = false)
178178
void setFilterChains(List<SecurityFilterChain> securityFilterChains) {
179-
securityFilterChains.sort(AnnotationAwareOrderComparator.INSTANCE);
180179
this.securityFilterChains = securityFilterChains;
181180
}
182181

183182
@Autowired(required = false)
184183
void setWebSecurityCustomizers(List<WebSecurityCustomizer> webSecurityCustomizers) {
185-
webSecurityCustomizers.sort(AnnotationAwareOrderComparator.INSTANCE);
186184
this.webSecurityCustomizers = webSecurityCustomizers;
187185
}
188186

config/src/test/java/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurationTests.java

+56
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,12 @@
1919
import java.io.Serializable;
2020
import java.lang.reflect.Method;
2121
import java.lang.reflect.Modifier;
22+
import java.util.ArrayList;
2223
import java.util.List;
2324

25+
import javax.servlet.Filter;
26+
import javax.servlet.http.HttpServletRequest;
27+
2428
import org.junit.Rule;
2529
import org.junit.Test;
2630

@@ -131,6 +135,19 @@ public void loadConfigWhenSecurityFilterChainsHaveOrderThenFilterChainsOrdered()
131135
assertThat(filterChains.get(3).matches(request)).isTrue();
132136
}
133137

138+
@Test
139+
public void loadConfigWhenSecurityFilterChainsHaveOrderOnBeanDefinitionsThenFilterChainsOrdered() {
140+
this.spring.register(OrderOnBeanDefinitionsSecurityFilterChainConfig.class).autowire();
141+
FilterChainProxy filterChainProxy = this.spring.getContext().getBean(FilterChainProxy.class);
142+
List<SecurityFilterChain> filterChains = filterChainProxy.getFilterChains();
143+
assertThat(filterChains).hasSize(2);
144+
MockHttpServletRequest request = new MockHttpServletRequest("GET", "");
145+
request.setServletPath("/role1/**");
146+
assertThat(filterChains.get(0).matches(request)).isTrue();
147+
request.setServletPath("/role2/**");
148+
assertThat(filterChains.get(1).matches(request)).isTrue();
149+
}
150+
134151
@Test
135152
public void loadConfigWhenWebSecurityConfigurersHaveSameOrderThenThrowBeanCreationException() {
136153
assertThatExceptionOfType(BeanCreationException.class)
@@ -472,6 +489,45 @@ SecurityFilterChain filterChain4(HttpSecurity http) throws Exception {
472489

473490
}
474491

492+
@EnableWebSecurity
493+
@Import(AuthenticationTestConfiguration.class)
494+
static class OrderOnBeanDefinitionsSecurityFilterChainConfig {
495+
496+
@Bean
497+
@Order(1)
498+
SecurityFilterChain securityFilterChain1(HttpSecurity http) throws Exception {
499+
// @formatter:off
500+
return http
501+
.antMatcher("/role1/**")
502+
.authorizeRequests((authorize) -> authorize
503+
.anyRequest().hasRole("1")
504+
)
505+
.build();
506+
// @formatter:on
507+
}
508+
509+
@Bean
510+
TestSecurityFilterChain securityFilterChain2(HttpSecurity http) throws Exception {
511+
return new TestSecurityFilterChain();
512+
}
513+
514+
@Order(2)
515+
static class TestSecurityFilterChain implements SecurityFilterChain {
516+
517+
@Override
518+
public boolean matches(HttpServletRequest request) {
519+
return true;
520+
}
521+
522+
@Override
523+
public List<Filter> getFilters() {
524+
return new ArrayList<>();
525+
}
526+
527+
}
528+
529+
}
530+
475531
@EnableWebSecurity
476532
@Import(AuthenticationTestConfiguration.class)
477533
static class DuplicateOrderConfig {

0 commit comments

Comments
 (0)