Use PortResolver Beans by Default

Closes gh-16664
This commit is contained in:
Rob Winch
2025-02-26 16:07:01 -06:00
parent 5f5427bd03
commit 76a566265c
8 changed files with 143 additions and 2 deletions

View File

@@ -38,6 +38,7 @@ import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestBuilders;
import org.springframework.security.web.PortMapper;
import org.springframework.security.web.PortResolver;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.access.ExceptionTranslationFilter;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
@@ -378,6 +379,13 @@ public class FormLoginConfigurerTests {
verify(ObjectPostProcessorConfig.objectPostProcessor).postProcess(any(ExceptionTranslationFilter.class));
}
@Test
public void configureWhenPortResolverBeanThenPortResolverUsed() throws Exception {
this.spring.register(CustomPortResolverConfig.class).autowire();
this.mockMvc.perform(get("/requires-authentication")).andExpect(status().is3xxRedirection());
verify(this.spring.getContext().getBean(PortResolver.class)).getServerPort(any());
}
@Configuration
@EnableWebSecurity
static class RequestCacheConfig {
@@ -723,6 +731,35 @@ public class FormLoginConfigurerTests {
}
@Configuration
@EnableWebSecurity
static class CustomPortResolverConfig {
@Bean
SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeHttpRequests((requests) -> requests
.anyRequest().authenticated()
)
.formLogin(withDefaults())
.requestCache(withDefaults());
return http.build();
// @formatter:on
}
@Bean
PortResolver portResolver() {
return mock(PortResolver.class);
}
@Bean
UserDetailsService userDetailsService() {
return new InMemoryUserDetailsManager(PasswordEncodedUser.user());
}
}
static class ReflectingObjectPostProcessor implements ObjectPostProcessor<Object> {
@Override

View File

@@ -35,6 +35,7 @@ import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.context.SecurityContextHolderStrategy;
import org.springframework.security.web.FilterChainProxy;
import org.springframework.security.web.PortResolver;
import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter;
@@ -45,6 +46,7 @@ import org.springframework.web.bind.annotation.RestController;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.Mockito.atLeastOnce;
import static org.mockito.Mockito.verify;
import static org.springframework.security.test.web.servlet.request.SecurityMockMvcRequestPostProcessors.csrf;
@@ -210,6 +212,17 @@ public class FormLoginConfigTests {
// @formatter:on
}
@Test
public void portResolver() throws Exception {
this.spring.configLocations(this.xml("PortResolverBean")).autowire();
// @formatter:off
this.mvc.perform(get("/requires-authentication"))
.andExpect(status().is3xxRedirection());
// @formatter:on
PortResolver portResolver = this.spring.getContext().getBean(PortResolver.class);
verify(portResolver, atLeastOnce()).getServerPort(any());
}
private Filter getFilter(ApplicationContext context, Class<? extends Filter> filterClass) {
FilterChainProxy filterChain = context.getBean(BeanIds.FILTER_CHAIN_PROXY, FilterChainProxy.class);
List<Filter> filters = filterChain.getFilters("/any");