diff --git a/config/src/test/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistryTests.java b/config/src/test/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistryTests.java index de7019c837..d5ebd3106a 100644 --- a/config/src/test/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistryTests.java +++ b/config/src/test/java/org/springframework/security/config/annotation/web/AbstractRequestMatcherRegistryTests.java @@ -16,11 +16,12 @@ package org.springframework.security.config.annotation.web; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; import java.util.List; import jakarta.servlet.DispatcherType; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.NoSuchBeanDefinitionException; @@ -112,7 +113,8 @@ public class AbstractRequestMatcherRegistryTests { } @Test - public void requestMatchersWhenPatternAndMvcPresentThenReturnMvcRequestMatcherType() { + public void requestMatchersWhenPatternAndMvcPresentThenReturnMvcRequestMatcherType() throws Exception { + mockMvcPresentClasspath(true); mockMvcIntrospector(true); List requestMatchers = this.matcherRegistry.requestMatchers("/path"); assertThat(requestMatchers).isNotEmpty(); @@ -121,7 +123,8 @@ public class AbstractRequestMatcherRegistryTests { } @Test - public void requestMatchersWhenHttpMethodAndPatternAndMvcPresentThenReturnMvcRequestMatcherType() { + public void requestMatchersWhenHttpMethodAndPatternAndMvcPresentThenReturnMvcRequestMatcherType() throws Exception { + mockMvcPresentClasspath(true); mockMvcIntrospector(true); List requestMatchers = this.matcherRegistry.requestMatchers(HttpMethod.GET, "/path"); assertThat(requestMatchers).isNotEmpty(); @@ -130,7 +133,8 @@ public class AbstractRequestMatcherRegistryTests { } @Test - public void requestMatchersWhenHttpMethodAndMvcPresentThenReturnMvcRequestMatcherType() { + public void requestMatchersWhenHttpMethodAndMvcPresentThenReturnMvcRequestMatcherType() throws Exception { + mockMvcPresentClasspath(true); mockMvcIntrospector(true); List requestMatchers = this.matcherRegistry.requestMatchers(HttpMethod.GET); assertThat(requestMatchers).isNotEmpty(); @@ -139,8 +143,8 @@ public class AbstractRequestMatcherRegistryTests { } @Test - @Disabled - public void requestMatchersWhenPatternAndMvcNotPresentThenReturnAntPathRequestMatcherType() { + public void requestMatchersWhenPatternAndMvcNotPresentThenReturnAntPathRequestMatcherType() throws Exception { + mockMvcPresentClasspath(false); mockMvcIntrospector(false); List requestMatchers = this.matcherRegistry.requestMatchers("/path"); assertThat(requestMatchers).isNotEmpty(); @@ -149,8 +153,9 @@ public class AbstractRequestMatcherRegistryTests { } @Test - @Disabled - public void requestMatchersWhenHttpMethodAndPatternAndMvcNotPresentThenReturnAntPathRequestMatcherType() { + public void requestMatchersWhenHttpMethodAndPatternAndMvcNotPresentThenReturnAntPathRequestMatcherType() + throws Exception { + mockMvcPresentClasspath(false); mockMvcIntrospector(false); List requestMatchers = this.matcherRegistry.requestMatchers(HttpMethod.GET, "/path"); assertThat(requestMatchers).isNotEmpty(); @@ -159,8 +164,8 @@ public class AbstractRequestMatcherRegistryTests { } @Test - @Disabled - public void requestMatchersWhenHttpMethodAndMvcNotPresentThenReturnAntPathMatcherType() { + public void requestMatchersWhenHttpMethodAndMvcNotPresentThenReturnAntPathMatcherType() throws Exception { + mockMvcPresentClasspath(false); mockMvcIntrospector(false); List requestMatchers = this.matcherRegistry.requestMatchers(HttpMethod.GET); assertThat(requestMatchers).isNotEmpty(); @@ -169,7 +174,9 @@ public class AbstractRequestMatcherRegistryTests { } @Test - public void requestMatchersWhenMvcPresentInClassPathAndMvcIntrospectorBeanNotAvailableThenException() { + public void requestMatchersWhenMvcPresentInClassPathAndMvcIntrospectorBeanNotAvailableThenException() + throws Exception { + mockMvcPresentClasspath(true); mockMvcIntrospector(false); assertThatExceptionOfType(NoSuchBeanDefinitionException.class) .isThrownBy(() -> this.matcherRegistry.requestMatchers("/path")).withMessageContaining( @@ -181,6 +188,15 @@ public class AbstractRequestMatcherRegistryTests { given(context.containsBean("mvcHandlerMappingIntrospector")).willReturn(isPresent); } + private void mockMvcPresentClasspath(Object newValue) throws Exception { + Field mvcPresentField = AbstractRequestMatcherRegistry.class.getDeclaredField("mvcPresent"); + mvcPresentField.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(mvcPresentField, mvcPresentField.getModifiers() & ~Modifier.FINAL); + mvcPresentField.set(null, newValue); + } + private static class TestRequestMatcherRegistry extends AbstractRequestMatcherRegistry> { @Override diff --git a/config/src/test/java/org/springframework/security/config/annotation/web/configurers/HttpSecuritySecurityMatchersTests.java b/config/src/test/java/org/springframework/security/config/annotation/web/configurers/HttpSecuritySecurityMatchersTests.java index 50567eb5f6..d4dd5b6093 100644 --- a/config/src/test/java/org/springframework/security/config/annotation/web/configurers/HttpSecuritySecurityMatchersTests.java +++ b/config/src/test/java/org/springframework/security/config/annotation/web/configurers/HttpSecuritySecurityMatchersTests.java @@ -16,10 +16,12 @@ package org.springframework.security.config.annotation.web.configurers; +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + import jakarta.servlet.http.HttpServletResponse; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -32,6 +34,7 @@ import org.springframework.mock.web.MockFilterChain; import org.springframework.mock.web.MockHttpServletRequest; import org.springframework.mock.web.MockHttpServletResponse; import org.springframework.mock.web.MockServletContext; +import org.springframework.security.config.annotation.web.AbstractRequestMatcherRegistry; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.core.userdetails.User; @@ -75,6 +78,7 @@ public class HttpSecuritySecurityMatchersTests { this.request.setMethod("GET"); this.response = new MockHttpServletResponse(); this.chain = new MockFilterChain(); + mockMvcPresentClasspath(true); } @AfterEach @@ -101,8 +105,8 @@ public class HttpSecuritySecurityMatchersTests { } @Test - @Disabled public void securityMatcherWhenNoMvcThenAntMatcher() throws Exception { + mockMvcPresentClasspath(false); loadConfig(SecurityMatcherNoMvcConfig.class, LegacyMvcMatchingConfig.class); this.request.setServletPath("/path"); this.springSecurityFilterChain.doFilter(this.request, this.response, this.chain); @@ -233,6 +237,20 @@ public class HttpSecuritySecurityMatchersTests { this.context.getAutowireCapableBeanFactory().autowireBean(this); } + private void mockMvcPresentClasspath(Object newValue) throws Exception { + mockMvcPresentClasspath(HttpSecurity.class, newValue); + mockMvcPresentClasspath(AbstractRequestMatcherRegistry.class, newValue); + } + + private void mockMvcPresentClasspath(Class clazz, Object newValue) throws Exception { + Field mvcPresentField = clazz.getDeclaredField("mvcPresent"); + mvcPresentField.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(mvcPresentField, mvcPresentField.getModifiers() & ~Modifier.FINAL); + mvcPresentField.set(null, newValue); + } + @EnableWebSecurity @Configuration @EnableWebMvc