Open
Description
Describe the bug
Once I added a DispatcherServlet
to my EAR application deployed on JBoss 7.4, I started to get the following exception:
Exception handling request to /myapp/rest/foo/hello: java.lang.IllegalArgumentException: This method cannot decide whether these patterns are Spring MVC patterns or not. If this endpoint is a Spring MVC endpoint, please use requestMatchers(MvcRequestMatcher); otherwise, please use requestMatchers(AntPathRequestMatcher).
This is because there is more than one mappable servlet in your servlet context:
[indeed, I have a lot of mapped servlets and the DispatcherServlet is not the first one]
For each MvcRequestMatcher, call MvcRequestMatcher#setServletPath to indicate the servlet path.
To Reproduce
Adding a security filter chain with some request matchers; something like this:
@Bean
public SecurityFilterChain mySecurityFilterChain(final HttpSecurity http) throws Exception {
http.csrf()
.disable()
.authorizeHttpRequests(new MyRules())
... // and so on
}
public class MyRules implements Customizer<AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry> {
@Override
public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry rules) {
// static resources
rules.requestMatchers("/index.html").permitAll();
rules.requestMatchers("/static/**").permitAll();
rules.requestMatchers("/**").denyAll();
}
}
Expected behavior
I would expect Spring Security to find my DispatcherServlet
mapping and so to use a MvcRequestMatcher
.
Please have a look at this line:
Shouldn't it be continue
instead of return null
, just like it is for requireOneRootDispatcherServlet
?
Otherwise this loop will always end on the first mapping if it's not a DispatcherServlet
...
Please note I'm on Spring Security 5.8.13 and that line is number 408 instead.