|
@@ -16,47 +16,30 @@
|
|
|
|
|
|
package org.springframework.security.config.annotation.web;
|
|
|
|
|
|
-import java.util.ArrayList;
|
|
|
import java.util.List;
|
|
|
+import java.util.stream.Stream;
|
|
|
|
|
|
import jakarta.servlet.DispatcherType;
|
|
|
-import jakarta.servlet.Servlet;
|
|
|
import org.junit.jupiter.api.BeforeEach;
|
|
|
import org.junit.jupiter.api.Test;
|
|
|
|
|
|
-import org.springframework.beans.factory.NoSuchBeanDefinitionException;
|
|
|
import org.springframework.beans.factory.ObjectProvider;
|
|
|
-import org.springframework.context.ApplicationContext;
|
|
|
import org.springframework.context.annotation.Configuration;
|
|
|
import org.springframework.core.ResolvableType;
|
|
|
import org.springframework.http.HttpMethod;
|
|
|
-import org.springframework.mock.web.MockHttpServletRequest;
|
|
|
import org.springframework.security.config.ObjectPostProcessor;
|
|
|
-import org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry.DispatcherServletDelegatingRequestMatcher;
|
|
|
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
|
|
|
-import org.springframework.security.config.test.SpringTestContext;
|
|
|
-import org.springframework.security.web.servlet.MockServletContext;
|
|
|
-import org.springframework.security.web.servlet.TestMockHttpServletMappings;
|
|
|
-import org.springframework.security.web.servlet.util.matcher.MvcRequestMatcher;
|
|
|
-import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
|
|
|
+import org.springframework.security.web.servlet.util.matcher.PathPatternRequestMatcher;
|
|
|
import org.springframework.security.web.util.matcher.DispatcherTypeRequestMatcher;
|
|
|
import org.springframework.security.web.util.matcher.RegexRequestMatcher;
|
|
|
import org.springframework.security.web.util.matcher.RequestMatcher;
|
|
|
-import org.springframework.test.web.servlet.MockMvc;
|
|
|
-import org.springframework.test.web.servlet.setup.MockMvcBuilders;
|
|
|
import org.springframework.web.context.WebApplicationContext;
|
|
|
-import org.springframework.web.servlet.DispatcherServlet;
|
|
|
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
|
|
|
|
|
|
import static org.assertj.core.api.Assertions.assertThat;
|
|
|
-import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
|
|
|
-import static org.assertj.core.api.InstanceOfAssertFactories.type;
|
|
|
+import static org.mockito.ArgumentMatchers.any;
|
|
|
import static org.mockito.BDDMockito.given;
|
|
|
import static org.mockito.Mockito.mock;
|
|
|
-import static org.mockito.Mockito.verify;
|
|
|
-import static org.mockito.Mockito.verifyNoInteractions;
|
|
|
-import static org.mockito.Mockito.verifyNoMoreInteractions;
|
|
|
-import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
|
|
|
|
|
|
/**
|
|
|
* Tests for {@link AbstractRequestMatcherRegistry}.
|
|
@@ -86,9 +69,13 @@ public class AbstractRequestMatcherRegistryTests {
|
|
|
ObjectProvider<ObjectPostProcessor<Object>> given = this.context.getBeanProvider(type);
|
|
|
given(given).willReturn(postProcessors);
|
|
|
given(postProcessors.getObject()).willReturn(NO_OP_OBJECT_POST_PROCESSOR);
|
|
|
- given(this.context.getServletContext()).willReturn(MockServletContext.mvc());
|
|
|
+ given(this.context.getBeanProvider(any(Class.class))).willReturn(new ObjectProvider<>() {
|
|
|
+ @Override
|
|
|
+ public Stream<Object> stream() {
|
|
|
+ return Stream.of();
|
|
|
+ }
|
|
|
+ });
|
|
|
this.matcherRegistry.setApplicationContext(this.context);
|
|
|
- mockMvcIntrospector(true);
|
|
|
}
|
|
|
|
|
|
@Test
|
|
@@ -110,24 +97,25 @@ public class AbstractRequestMatcherRegistryTests {
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void antMatchersWhenHttpMethodAndPatternParamsThenReturnAntPathRequestMatcherType() {
|
|
|
+ public void pathPatternWhenHttpMethodAndPatternParamsThenReturnPathPatternRequestMatcherType() {
|
|
|
List<RequestMatcher> requestMatchers = this.matcherRegistry
|
|
|
- .requestMatchers(new AntPathRequestMatcher("/a.*", HttpMethod.GET.name()));
|
|
|
+ .requestMatchers(PathPatternRequestMatcher.withDefaults().matcher(HttpMethod.GET, "/a.*"));
|
|
|
assertThat(requestMatchers).isNotEmpty();
|
|
|
assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isExactlyInstanceOf(AntPathRequestMatcher.class);
|
|
|
+ assertThat(requestMatchers.get(0)).isExactlyInstanceOf(PathPatternRequestMatcher.class);
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void antMatchersWhenPatternParamThenReturnAntPathRequestMatcherType() {
|
|
|
- List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers(new AntPathRequestMatcher("/a.*"));
|
|
|
+ public void pathPatternWhenPatternParamThenReturnPathPatternRequestMatcherType() {
|
|
|
+ List<RequestMatcher> requestMatchers = this.matcherRegistry
|
|
|
+ .requestMatchers(PathPatternRequestMatcher.withDefaults().matcher("/a.*"));
|
|
|
assertThat(requestMatchers).isNotEmpty();
|
|
|
assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isExactlyInstanceOf(AntPathRequestMatcher.class);
|
|
|
+ assertThat(requestMatchers.get(0)).isExactlyInstanceOf(PathPatternRequestMatcher.class);
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void dispatcherTypeMatchersWhenHttpMethodAndPatternParamsThenReturnAntPathRequestMatcherType() {
|
|
|
+ public void dispatcherTypeMatchersWhenHttpMethodAndPatternParamsThenReturnPathPatternRequestMatcherType() {
|
|
|
List<RequestMatcher> requestMatchers = this.matcherRegistry.dispatcherTypeMatchers(HttpMethod.GET,
|
|
|
DispatcherType.ASYNC);
|
|
|
assertThat(requestMatchers).isNotEmpty();
|
|
@@ -136,7 +124,7 @@ public class AbstractRequestMatcherRegistryTests {
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void dispatcherMatchersWhenPatternParamThenReturnAntPathRequestMatcherType() {
|
|
|
+ public void dispatcherMatchersWhenPatternParamThenReturnPathPatternRequestMatcherType() {
|
|
|
List<RequestMatcher> requestMatchers = this.matcherRegistry.dispatcherTypeMatchers(DispatcherType.INCLUDE);
|
|
|
assertThat(requestMatchers).isNotEmpty();
|
|
|
assertThat(requestMatchers).hasSize(1);
|
|
@@ -144,252 +132,36 @@ public class AbstractRequestMatcherRegistryTests {
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void requestMatchersWhenPatternAndMvcPresentThenReturnMvcRequestMatcherType() {
|
|
|
+ public void requestMatchersWhenPatternAndMvcPresentThenReturnPathPatternRequestMatcherType() {
|
|
|
List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/path");
|
|
|
assertThat(requestMatchers).isNotEmpty();
|
|
|
assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isExactlyInstanceOf(MvcRequestMatcher.class);
|
|
|
+ assertThat(requestMatchers.get(0)).isExactlyInstanceOf(PathPatternRequestMatcher.class);
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void requestMatchersWhenHttpMethodAndPatternAndMvcPresentThenReturnMvcRequestMatcherType() {
|
|
|
+ public void requestMatchersWhenHttpMethodAndPatternAndMvcPresentThenReturnPathPatternRequestMatcherType() {
|
|
|
List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers(HttpMethod.GET, "/path");
|
|
|
assertThat(requestMatchers).isNotEmpty();
|
|
|
assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isExactlyInstanceOf(MvcRequestMatcher.class);
|
|
|
+ assertThat(requestMatchers.get(0)).isExactlyInstanceOf(PathPatternRequestMatcher.class);
|
|
|
}
|
|
|
|
|
|
@Test
|
|
|
- public void requestMatchersWhenHttpMethodAndMvcPresentThenReturnMvcRequestMatcherType() {
|
|
|
+ public void requestMatchersWhenHttpMethodAndMvcPresentThenReturnPathPatternRequestMatcherType() {
|
|
|
List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers(HttpMethod.GET);
|
|
|
assertThat(requestMatchers).isNotEmpty();
|
|
|
assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isExactlyInstanceOf(MvcRequestMatcher.class);
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenMvcPresentInClassPathAndMvcIntrospectorBeanNotAvailableThenException() {
|
|
|
- mockMvcIntrospector(false);
|
|
|
- assertThatExceptionOfType(NoSuchBeanDefinitionException.class)
|
|
|
- .isThrownBy(() -> this.matcherRegistry.requestMatchers("/path"))
|
|
|
- .withMessageContaining(
|
|
|
- "Please ensure Spring Security & Spring MVC are configured in a shared ApplicationContext");
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenNoDispatcherServletThenAntPathRequestMatcherType() {
|
|
|
- mockMvcIntrospector(true);
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- MockHttpServletRequest request = new MockHttpServletRequest();
|
|
|
- List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).isNotEmpty();
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).asInstanceOf(type(DispatcherServletDelegatingRequestMatcher.class))
|
|
|
- .extracting((matcher) -> matcher.requestMatcher(request))
|
|
|
- .isInstanceOf(AntPathRequestMatcher.class);
|
|
|
- servletContext.addServlet("servletOne", Servlet.class).addMapping("/one");
|
|
|
- servletContext.addServlet("servletTwo", Servlet.class).addMapping("/two");
|
|
|
- requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).isNotEmpty();
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).asInstanceOf(type(DispatcherServletDelegatingRequestMatcher.class))
|
|
|
- .extracting((matcher) -> matcher.requestMatcher(request))
|
|
|
- .isInstanceOf(AntPathRequestMatcher.class);
|
|
|
- servletContext.addServlet("servletOne", Servlet.class);
|
|
|
- servletContext.addServlet("servletTwo", Servlet.class);
|
|
|
- requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).isNotEmpty();
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).asInstanceOf(type(DispatcherServletDelegatingRequestMatcher.class))
|
|
|
- .extracting((matcher) -> matcher.requestMatcher(request))
|
|
|
- .isInstanceOf(AntPathRequestMatcher.class);
|
|
|
- }
|
|
|
-
|
|
|
- // gh-14418
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenNoDispatcherServletMockMvcThenMvcRequestMatcherType() throws Exception {
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- try (SpringTestContext spring = new SpringTestContext(this)) {
|
|
|
- spring.register(MockMvcConfiguration.class)
|
|
|
- .postProcessor((context) -> context.setServletContext(servletContext))
|
|
|
- .autowire();
|
|
|
- this.matcherRegistry.setApplicationContext(spring.getContext());
|
|
|
- MockMvc mvc = MockMvcBuilders.webAppContextSetup(spring.getContext()).build();
|
|
|
- MockHttpServletRequest request = mvc.perform(get("/")).andReturn().getRequest();
|
|
|
- List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).isNotEmpty();
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).asInstanceOf(type(DispatcherServletDelegatingRequestMatcher.class))
|
|
|
- .extracting((matcher) -> matcher.requestMatcher(request))
|
|
|
- .isInstanceOf(MvcRequestMatcher.class);
|
|
|
- servletContext.addServlet("servletOne", Servlet.class).addMapping("/one");
|
|
|
- servletContext.addServlet("servletTwo", Servlet.class).addMapping("/two");
|
|
|
- requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).isNotEmpty();
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).asInstanceOf(type(DispatcherServletDelegatingRequestMatcher.class))
|
|
|
- .extracting((matcher) -> matcher.requestMatcher(request))
|
|
|
- .isInstanceOf(MvcRequestMatcher.class);
|
|
|
- servletContext.addServlet("servletOne", Servlet.class);
|
|
|
- servletContext.addServlet("servletTwo", Servlet.class);
|
|
|
- requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).isNotEmpty();
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).asInstanceOf(type(DispatcherServletDelegatingRequestMatcher.class))
|
|
|
- .extracting((matcher) -> matcher.requestMatcher(request))
|
|
|
- .isInstanceOf(MvcRequestMatcher.class);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenAmbiguousServletsThenException() {
|
|
|
- mockMvcIntrospector(true);
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/");
|
|
|
- servletContext.addServlet("servletTwo", DispatcherServlet.class).addMapping("/servlet/*");
|
|
|
- assertThatExceptionOfType(IllegalArgumentException.class)
|
|
|
- .isThrownBy(() -> this.matcherRegistry.requestMatchers("/**"));
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenMultipleDispatcherServletMappingsThenException() {
|
|
|
- mockMvcIntrospector(true);
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/", "/mvc/*");
|
|
|
- assertThatExceptionOfType(IllegalArgumentException.class)
|
|
|
- .isThrownBy(() -> this.matcherRegistry.requestMatchers("/**"));
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenPathDispatcherServletAndOtherServletsThenException() {
|
|
|
- mockMvcIntrospector(true);
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/mvc/*");
|
|
|
- servletContext.addServlet("default", Servlet.class).addMapping("/");
|
|
|
- assertThatExceptionOfType(IllegalArgumentException.class)
|
|
|
- .isThrownBy(() -> this.matcherRegistry.requestMatchers("/**"));
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenUnmappableServletsThenSkips() {
|
|
|
- mockMvcIntrospector(true);
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/");
|
|
|
- servletContext.addServlet("servletTwo", Servlet.class);
|
|
|
- List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isInstanceOf(MvcRequestMatcher.class);
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenOnlyDispatcherServletThenAllows() {
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/mvc/*");
|
|
|
- List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isInstanceOf(MvcRequestMatcher.class);
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenImplicitServletsThenAllows() {
|
|
|
- mockMvcIntrospector(true);
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- servletContext.addServlet("defaultServlet", Servlet.class);
|
|
|
- servletContext.addServlet("jspServlet", Servlet.class).addMapping("*.jsp", "*.jspx");
|
|
|
- servletContext.addServlet("dispatcherServlet", DispatcherServlet.class).addMapping("/");
|
|
|
- List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/**");
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isInstanceOf(DispatcherServletDelegatingRequestMatcher.class);
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void requestMatchersWhenPathBasedNonDispatcherServletThenAllows() {
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- given(this.context.getServletContext()).willReturn(servletContext);
|
|
|
- servletContext.addServlet("path", Servlet.class).addMapping("/services/*");
|
|
|
- servletContext.addServlet("default", DispatcherServlet.class).addMapping("/");
|
|
|
- List<RequestMatcher> requestMatchers = this.matcherRegistry.requestMatchers("/services/*");
|
|
|
- assertThat(requestMatchers).hasSize(1);
|
|
|
- assertThat(requestMatchers.get(0)).isInstanceOf(DispatcherServletDelegatingRequestMatcher.class);
|
|
|
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext, "GET", "/services/endpoint");
|
|
|
- request.setHttpServletMapping(TestMockHttpServletMappings.defaultMapping());
|
|
|
- assertThat(requestMatchers.get(0).matcher(request).isMatch()).isTrue();
|
|
|
- request.setHttpServletMapping(TestMockHttpServletMappings.path(request, "/services"));
|
|
|
- request.setServletPath("/services");
|
|
|
- request.setPathInfo("/endpoint");
|
|
|
- assertThat(requestMatchers.get(0).matcher(request).isMatch()).isTrue();
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void matchesWhenDispatcherServletThenMvc() {
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- servletContext.addServlet("default", DispatcherServlet.class).addMapping("/");
|
|
|
- servletContext.addServlet("path", Servlet.class).addMapping("/services/*");
|
|
|
- MvcRequestMatcher mvc = mock(MvcRequestMatcher.class);
|
|
|
- AntPathRequestMatcher ant = mock(AntPathRequestMatcher.class);
|
|
|
- RequestMatcher requestMatcher = new DispatcherServletDelegatingRequestMatcher(ant, mvc);
|
|
|
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext, "GET", "/services/endpoint");
|
|
|
- request.setHttpServletMapping(TestMockHttpServletMappings.defaultMapping());
|
|
|
- assertThat(requestMatcher.matches(request)).isFalse();
|
|
|
- verify(mvc).matches(request);
|
|
|
- verifyNoInteractions(ant);
|
|
|
- request.setHttpServletMapping(TestMockHttpServletMappings.path(request, "/services"));
|
|
|
- assertThat(requestMatcher.matches(request)).isFalse();
|
|
|
- verify(ant).matches(request);
|
|
|
- verifyNoMoreInteractions(mvc);
|
|
|
- }
|
|
|
-
|
|
|
- @Test
|
|
|
- public void matchesWhenNoMappingThenException() {
|
|
|
- MockServletContext servletContext = new MockServletContext();
|
|
|
- servletContext.addServlet("default", DispatcherServlet.class).addMapping("/");
|
|
|
- servletContext.addServlet("path", Servlet.class).addMapping("/services/*");
|
|
|
- MvcRequestMatcher mvc = mock(MvcRequestMatcher.class);
|
|
|
- AntPathRequestMatcher ant = mock(AntPathRequestMatcher.class);
|
|
|
- RequestMatcher requestMatcher = new DispatcherServletDelegatingRequestMatcher(ant, mvc);
|
|
|
- MockHttpServletRequest request = new MockHttpServletRequest(servletContext, "GET", "/services/endpoint");
|
|
|
- assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> requestMatcher.matcher(request));
|
|
|
- }
|
|
|
-
|
|
|
- private void mockMvcIntrospector(boolean isPresent) {
|
|
|
- ApplicationContext context = this.matcherRegistry.getApplicationContext();
|
|
|
- given(context.containsBean("mvcHandlerMappingIntrospector")).willReturn(isPresent);
|
|
|
+ assertThat(requestMatchers.get(0)).isExactlyInstanceOf(PathPatternRequestMatcher.class);
|
|
|
}
|
|
|
|
|
|
private static class TestRequestMatcherRegistry extends AbstractRequestMatcherRegistry<List<RequestMatcher>> {
|
|
|
|
|
|
- @Override
|
|
|
- public List<RequestMatcher> requestMatchers(RequestMatcher... requestMatchers) {
|
|
|
- return unwrap(super.requestMatchers(requestMatchers));
|
|
|
- }
|
|
|
-
|
|
|
@Override
|
|
|
protected List<RequestMatcher> chainRequestMatchers(List<RequestMatcher> requestMatchers) {
|
|
|
return requestMatchers;
|
|
|
}
|
|
|
|
|
|
- private List<RequestMatcher> unwrap(List<RequestMatcher> wrappedMatchers) {
|
|
|
- List<RequestMatcher> requestMatchers = new ArrayList<>();
|
|
|
- for (RequestMatcher requestMatcher : wrappedMatchers) {
|
|
|
- if (requestMatcher instanceof DeferredRequestMatcher) {
|
|
|
- DeferredRequestMatcher deferred = (DeferredRequestMatcher) requestMatcher;
|
|
|
- WebApplicationContext web = (WebApplicationContext) getApplicationContext();
|
|
|
- requestMatchers.add(deferred.requestMatcher(web.getServletContext()));
|
|
|
- }
|
|
|
- else {
|
|
|
- requestMatchers.add(requestMatcher);
|
|
|
- }
|
|
|
- }
|
|
|
- return requestMatchers;
|
|
|
- }
|
|
|
-
|
|
|
}
|
|
|
|
|
|
@Configuration
|