Skip to content

Commit ed96e2c

Browse files
committed
Ignore Unmappable Servlets
Closes gh-13666
1 parent 7200f76 commit ed96e2c

File tree

3 files changed

+34
-7
lines changed

3 files changed

+34
-7
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistry.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import java.util.ArrayList;
2020
import java.util.Arrays;
21+
import java.util.LinkedHashMap;
2122
import java.util.List;
2223
import java.util.Map;
2324

@@ -312,8 +313,8 @@ public C requestMatchers(HttpMethod method, String... patterns) {
312313
if (servletContext == null) {
313314
return requestMatchers(RequestMatchers.antMatchersAsArray(method, patterns));
314315
}
315-
Map<String, ? extends ServletRegistration> registrations = servletContext.getServletRegistrations();
316-
if (registrations == null) {
316+
Map<String, ? extends ServletRegistration> registrations = mappableServletRegistrations(servletContext);
317+
if (registrations.isEmpty()) {
317318
return requestMatchers(RequestMatchers.antMatchersAsArray(method, patterns));
318319
}
319320
if (!hasDispatcherServlet(registrations)) {
@@ -324,6 +325,16 @@ public C requestMatchers(HttpMethod method, String... patterns) {
324325
return requestMatchers(createMvcMatchers(method, patterns).toArray(new RequestMatcher[0]));
325326
}
326327

328+
private Map<String, ? extends ServletRegistration> mappableServletRegistrations(ServletContext servletContext) {
329+
Map<String, ServletRegistration> mappable = new LinkedHashMap<>();
330+
for (Map.Entry<String, ? extends ServletRegistration> entry : servletContext.getServletRegistrations().entrySet()) {
331+
if (!entry.getValue().getMappings().isEmpty()) {
332+
mappable.put(entry.getKey(), entry.getValue());
333+
}
334+
}
335+
return mappable;
336+
}
337+
327338
private boolean hasDispatcherServlet(Map<String, ? extends ServletRegistration> registrations) {
328339
if (registrations == null) {
329340
return false;

config/src/test/java/org/springframework/security/config/MockServletContext.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@
1616

1717
package org.springframework.security.config;
1818

19+
import java.util.Arrays;
1920
import java.util.Collection;
2021
import java.util.LinkedHashMap;
22+
import java.util.LinkedHashSet;
2123
import java.util.Map;
2224
import java.util.Set;
2325

@@ -35,7 +37,7 @@ public class MockServletContext extends org.springframework.mock.web.MockServlet
3537

3638
public static MockServletContext mvc() {
3739
MockServletContext servletContext = new MockServletContext();
38-
servletContext.addServlet("dispatcherServlet", DispatcherServlet.class);
40+
servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/");
3941
return servletContext;
4042
}
4143

@@ -59,6 +61,8 @@ private static class MockServletRegistration implements ServletRegistration.Dyna
5961

6062
private final Class<?> clazz;
6163

64+
private final Set<String> mappings = new LinkedHashSet<>();
65+
6266
MockServletRegistration(String name, Class<?> clazz) {
6367
this.name = name;
6468
this.clazz = clazz;
@@ -91,12 +95,13 @@ public void setAsyncSupported(boolean isAsyncSupported) {
9195

9296
@Override
9397
public Set<String> addMapping(String... urlPatterns) {
94-
return null;
98+
this.mappings.addAll(Arrays.asList(urlPatterns));
99+
return this.mappings;
95100
}
96101

97102
@Override
98103
public Collection<String> getMappings() {
99-
return null;
104+
return this.mappings;
100105
}
101106

102107
@Override

config/src/test/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistryTests.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,23 @@ public void requestMatchersWhenNoDispatcherServletThenAntPathRequestMatcherType(
211211
public void requestMatchersWhenAmbiguousServletsThenException() {
212212
MockServletContext servletContext = new MockServletContext();
213213
given(this.context.getServletContext()).willReturn(servletContext);
214-
servletContext.addServlet("dispatcherServlet", DispatcherServlet.class);
215-
servletContext.addServlet("servletTwo", Servlet.class);
214+
servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/");
215+
servletContext.addServlet("servletTwo", Servlet.class).addMapping("/servlet/**");
216216
assertThatExceptionOfType(IllegalArgumentException.class)
217217
.isThrownBy(() -> this.matcherRegistry.requestMatchers("/**"));
218218
}
219219

220+
@Test
221+
public void requestMatchersWhenUnmappableServletsThenSkips() {
222+
MockServletContext servletContext = new MockServletContext();
223+
given(this.context.getServletContext()).willReturn(servletContext);
224+
servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/");
225+
servletContext.addServlet("servletTwo", Servlet.class);
226+
List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/**");
227+
assertThat(requestMatchers).hasSize(1);
228+
assertThat(requestMatchers.get(0)).isInstanceOf(MvcRequestMatcher.class);
229+
}
230+
220231
private void mockMvcIntrospector(boolean isPresent) {
221232
ApplicationContext context = this.matcherRegistry.getApplicationContext();
222233
given(context.containsBean("mvcHandlerMappingIntrospector")).willReturn(isPresent);

0 commit comments

Comments
 (0)