@ -23,6 +23,7 @@ import java.util.concurrent.Callable;
@@ -23,6 +23,7 @@ import java.util.concurrent.Callable;
import com.google.common.net.HttpHeaders ;
import io.micrometer.observation.ObservationRegistry ;
import jakarta.servlet.Filter ;
import jakarta.servlet.http.HttpServletRequest ;
import jakarta.servlet.http.HttpServletResponse ;
import org.junit.jupiter.api.Test ;
@ -50,6 +51,7 @@ import org.springframework.security.config.annotation.SecurityContextChangedList
@@ -50,6 +51,7 @@ import org.springframework.security.config.annotation.SecurityContextChangedList
import org.springframework.security.config.annotation.web.builders.HttpSecurity ;
import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer ;
import org.springframework.security.config.annotation.web.configurers.AnonymousConfigurer ;
import org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer ;
import org.springframework.security.config.test.SpringTestContext ;
import org.springframework.security.config.test.SpringTestContextExtension ;
import org.springframework.security.core.Authentication ;
@ -61,6 +63,8 @@ import org.springframework.security.core.userdetails.UserDetailsService;
@@ -61,6 +63,8 @@ import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager ;
import org.springframework.security.test.web.servlet.RequestCacheResultMatcher ;
import org.springframework.security.web.SecurityFilterChain ;
import org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter ;
import org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter ;
import org.springframework.security.web.header.writers.frameoptions.XFrameOptionsHeaderWriter ;
import org.springframework.test.web.servlet.MockMvc ;
import org.springframework.test.web.servlet.MvcResult ;
@ -336,6 +340,16 @@ public class HttpSecurityConfigurationTests {
@@ -336,6 +340,16 @@ public class HttpSecurityConfigurationTests {
this . mockMvc . perform ( get ( "/" ) ) ;
}
// gh-13203
@Test
public void disableConfigurerWhenAppliedByAnotherConfigurerThenNotApplied ( ) {
this . spring . register ( ApplyCustomDslConfig . class ) . autowire ( ) ;
SecurityFilterChain filterChain = this . spring . getContext ( ) . getBean ( SecurityFilterChain . class ) ;
List < Filter > filters = filterChain . getFilters ( ) ;
assertThat ( filters ) . doesNotHaveAnyElementsOfTypes ( DefaultLoginPageGeneratingFilter . class ,
DefaultLogoutPageGeneratingFilter . class ) ;
}
@RestController
static class NameController {
@ -575,6 +589,31 @@ public class HttpSecurityConfigurationTests {
@@ -575,6 +589,31 @@ public class HttpSecurityConfigurationTests {
}
@Configuration
@EnableWebSecurity
static class ApplyCustomDslConfig {
@Bean
SecurityFilterChain filterChain ( HttpSecurity http ) throws Exception {
http . apply ( CustomDsl . customDsl ( ) ) ;
return http . build ( ) ;
}
}
static class CustomDsl extends AbstractHttpConfigurer < CustomDsl , HttpSecurity > {
@Override
public void init ( HttpSecurity http ) throws Exception {
http . formLogin ( FormLoginConfigurer : : disable ) ;
}
static CustomDsl customDsl ( ) {
return new CustomDsl ( ) ;
}
}
static class DefaultConfigurer extends AbstractHttpConfigurer < DefaultConfigurer , HttpSecurity > {
boolean init ;