1
0
mirror of synced 2026-05-22 21:33:16 +00:00

Merge branch '6.5.x'

Closes gh-17581
This commit is contained in:
Rob Winch
2025-07-21 09:30:11 -05:00
2 changed files with 38 additions and 3 deletions
@@ -50,6 +50,7 @@ import org.springframework.web.filter.DelegatingFilterProxy;
* @param <O> The object that this builder returns
* @param <B> The type of this builder (that is returned by the base class)
* @author Rob Winch
* @author DingHao
* @see WebSecurity
*/
public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBuilder<O>>
@@ -59,7 +60,7 @@ public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBui
private final LinkedHashMap<Class<? extends SecurityConfigurer<O, B>>, List<SecurityConfigurer<O, B>>> configurers = new LinkedHashMap<>();
private final List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();
private List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();
private final Map<Class<?>, Object> sharedObjects = new HashMap<>();
@@ -369,8 +370,12 @@ public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBui
for (SecurityConfigurer<O, B> configurer : configurers) {
configurer.init((B) this);
}
for (SecurityConfigurer<O, B> configurer : this.configurersAddedInInitializing) {
configurer.init((B) this);
while (!this.configurersAddedInInitializing.isEmpty()) {
List<SecurityConfigurer<O, B>> toInit = this.configurersAddedInInitializing;
this.configurersAddedInInitializing = new ArrayList<>();
for (SecurityConfigurer<O, B> configurer : toInit) {
configurer.init((B) this);
}
}
}
@@ -163,6 +163,36 @@ public class AbstractConfiguredSecurityBuilderTests {
assertThat(this.builder.getConfigurers(TestSecurityConfigurer.class)).hasSize(1);
}
@Test
public void withWhenConfigurerAddInitializing() throws Exception {
this.builder.with(new AppliesNestedConfigurer(), Customizer.withDefaults());
assertThat(this.builder.build()).isEqualTo("success");
}
private static class AppliesNestedConfigurer
extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {
@Override
public void init(TestConfiguredSecurityBuilder builder) throws Exception {
builder.with(new NestedConfigurer(), Customizer.withDefaults());
}
}
private static class NestedConfigurer extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {
@Override
public void init(TestConfiguredSecurityBuilder http) throws Exception {
http.with(new DoubleNestedConfigurer(), Customizer.withDefaults());
}
}
private static class DoubleNestedConfigurer
extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {
}
private static class ApplyAndRemoveSecurityConfigurer
extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {