Skip to content

Commit ed3b0fb

Browse files
Prevent using both authorizeRequests and authorizeHttpRequests
Closes gh-10573
1 parent 62e8799 commit ed3b0fb

File tree

2 files changed

+65
-0
lines changed

2 files changed

+65
-0
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/builders/HttpSecurity.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2889,8 +2889,15 @@ protected void beforeConfigure() throws Exception {
28892889
}
28902890
}
28912891

2892+
@SuppressWarnings("unchecked")
28922893
@Override
28932894
protected DefaultSecurityFilterChain performBuild() {
2895+
ExpressionUrlAuthorizationConfigurer<?> expressionConfigurer = getConfigurer(
2896+
ExpressionUrlAuthorizationConfigurer.class);
2897+
AuthorizeHttpRequestsConfigurer<?> httpConfigurer = getConfigurer(AuthorizeHttpRequestsConfigurer.class);
2898+
boolean oneConfigurerPresent = expressionConfigurer == null ^ httpConfigurer == null;
2899+
Assert.state((expressionConfigurer == null && httpConfigurer == null) || oneConfigurerPresent,
2900+
"authorizeHttpRequests cannot be used in conjunction with authorizeRequests. Please select just one.");
28942901
this.filters.sort(OrderComparator.INSTANCE);
28952902
List<Filter> sortedFilters = new ArrayList<>(this.filters.size());
28962903
for (Filter filter : this.filters) {

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

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.junit.jupiter.api.Test;
2525
import org.junit.jupiter.api.extension.ExtendWith;
2626

27+
import org.springframework.beans.factory.BeanCreationException;
2728
import org.springframework.beans.factory.annotation.Autowired;
2829
import org.springframework.context.annotation.Bean;
2930
import org.springframework.context.annotation.Configuration;
@@ -47,6 +48,7 @@
4748
import org.springframework.web.bind.annotation.RestController;
4849

4950
import static org.assertj.core.api.Assertions.assertThat;
51+
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
5052
import static org.springframework.security.config.Customizer.withDefaults;
5153
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.authentication;
5254
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
@@ -200,6 +202,24 @@ public void loginWhenUsingDefaultsThenDefaultLogoutSuccessPageGenerated() throws
200202
this.mockMvc.perform(get("/login?logout")).andExpect(status().isOk());
201203
}
202204

205+
@Test
206+
public void configureWhenAuthorizeHttpRequestsBeforeAuthorizeRequestThenException() {
207+
assertThatExceptionOfType(BeanCreationException.class)
208+
.isThrownBy(
209+
() -> this.spring.register(AuthorizeHttpRequestsBeforeAuthorizeRequestsConfig.class).autowire())
210+
.withMessageContaining(
211+
"authorizeHttpRequests cannot be used in conjunction with authorizeRequests. Please select just one.");
212+
}
213+
214+
@Test
215+
public void configureWhenAuthorizeHttpRequestsAfterAuthorizeRequestThenException() {
216+
assertThatExceptionOfType(BeanCreationException.class)
217+
.isThrownBy(
218+
() -> this.spring.register(AuthorizeHttpRequestsAfterAuthorizeRequestsConfig.class).autowire())
219+
.withMessageContaining(
220+
"authorizeHttpRequests cannot be used in conjunction with authorizeRequests. Please select just one.");
221+
}
222+
203223
@RestController
204224
static class NameController {
205225

@@ -270,6 +290,44 @@ UserDetailsService userDetailsService() {
270290

271291
}
272292

293+
@EnableWebSecurity
294+
static class AuthorizeHttpRequestsBeforeAuthorizeRequestsConfig {
295+
296+
@Bean
297+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
298+
// @formatter:off
299+
return http
300+
.authorizeHttpRequests((requests) -> requests
301+
.anyRequest().authenticated()
302+
)
303+
.authorizeRequests((requests) -> requests
304+
.anyRequest().authenticated()
305+
)
306+
.build();
307+
// @formatter:on
308+
}
309+
310+
}
311+
312+
@EnableWebSecurity
313+
static class AuthorizeHttpRequestsAfterAuthorizeRequestsConfig {
314+
315+
@Bean
316+
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
317+
// @formatter:off
318+
return http
319+
.authorizeRequests((requests) -> requests
320+
.anyRequest().authenticated()
321+
)
322+
.authorizeHttpRequests((requests) -> requests
323+
.anyRequest().authenticated()
324+
)
325+
.build();
326+
// @formatter:on
327+
}
328+
329+
}
330+
273331
@RestController
274332
static class BaseController {
275333

0 commit comments

Comments
 (0)