-
Notifications
You must be signed in to change notification settings - Fork 6.2k
Description
Describe the bug
Defining multiple .requestMatchers().mvcMatchers() are overriding previous one.
http
.requestMatchers()
.mvcMatchers("/api-1")
.mvcMatchers("/api-2")
.mvcMatchers("/api-3")
.and()
In the example above matcher for "/api-3" will override the one for "/api-1", and result matcher list will contain only two latest matchers: "/api-2" and "/api-3".
Expected behavior
All matches should be used together, joined by OrRequestMatcher.
Possible issue
MvcMatchersRequestMatcherConfigurer that returned after .mvcMatchers() contains only the last pattern, but it should collect all pattern combined together.
I think the line https://github.com/spring-projects/spring-security/blob/main/config/src/main/java/org/springframework/security/config/annotation/web/builders/HttpSecurity.java#L3119 from the following code:
@Override
public MvcMatchersRequestMatcherConfigurer mvcMatchers(HttpMethod method, String... mvcPatterns) {
List<MvcRequestMatcher> mvcMatchers = createMvcMatchers(method, mvcPatterns);
setMatchers(mvcMatchers);
return new MvcMatchersRequestMatcherConfigurer(getContext(), mvcMatchers);
}
should be changed to return all matches: this.matchers, like below:
@Override
public MvcMatchersRequestMatcherConfigurer mvcMatchers(HttpMethod method, String... mvcPatterns) {
List<MvcRequestMatcher> mvcMatchers = createMvcMatchers(method, mvcPatterns);
setMatchers(mvcMatchers);
return new MvcMatchersRequestMatcherConfigurer(getContext(), this.matchers);
}
Version
Reproduced on v5.3.4.
But main and the latest v5.6.2 contains the same code.