Skip to content

Commit 85dc06b

Browse files
committed
Merge branch '6.5.x'
Closes gh-17581
2 parents 4fa2d32 + 80ccb9b commit 85dc06b

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

config/src/main/java/org/springframework/security/config/annotation/AbstractConfiguredSecurityBuilder.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
* @param <O> The object that this builder returns
5151
* @param <B> The type of this builder (that is returned by the base class)
5252
* @author Rob Winch
53+
* @author DingHao
5354
* @see WebSecurity
5455
*/
5556
public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBuilder<O>>
@@ -59,7 +60,7 @@ public abstract class AbstractConfiguredSecurityBuilder<O, B extends SecurityBui
5960

6061
private final LinkedHashMap<Class<? extends SecurityConfigurer<O, B>>, List<SecurityConfigurer<O, B>>> configurers = new LinkedHashMap<>();
6162

62-
private final List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();
63+
private List<SecurityConfigurer<O, B>> configurersAddedInInitializing = new ArrayList<>();
6364

6465
private final Map<Class<?>, Object> sharedObjects = new HashMap<>();
6566

@@ -369,8 +370,12 @@ private void init() throws Exception {
369370
for (SecurityConfigurer<O, B> configurer : configurers) {
370371
configurer.init((B) this);
371372
}
372-
for (SecurityConfigurer<O, B> configurer : this.configurersAddedInInitializing) {
373-
configurer.init((B) this);
373+
while (!this.configurersAddedInInitializing.isEmpty()) {
374+
List<SecurityConfigurer<O, B>> toInit = this.configurersAddedInInitializing;
375+
this.configurersAddedInInitializing = new ArrayList<>();
376+
for (SecurityConfigurer<O, B> configurer : toInit) {
377+
configurer.init((B) this);
378+
}
374379
}
375380
}
376381

config/src/test/java/org/springframework/security/config/annotation/web/AbstractConfiguredSecurityBuilderTests.java

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,36 @@ public void withWhenDuplicateConfigurerAddedThenDuplicateConfigurerRemoved() thr
163163
assertThat(this.builder.getConfigurers(TestSecurityConfigurer.class)).hasSize(1);
164164
}
165165

166+
@Test
167+
public void withWhenConfigurerAddInitializing() throws Exception {
168+
this.builder.with(new AppliesNestedConfigurer(), Customizer.withDefaults());
169+
assertThat(this.builder.build()).isEqualTo("success");
170+
}
171+
172+
private static class AppliesNestedConfigurer
173+
extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {
174+
175+
@Override
176+
public void init(TestConfiguredSecurityBuilder builder) throws Exception {
177+
builder.with(new NestedConfigurer(), Customizer.withDefaults());
178+
}
179+
180+
}
181+
182+
private static class NestedConfigurer extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {
183+
184+
@Override
185+
public void init(TestConfiguredSecurityBuilder http) throws Exception {
186+
http.with(new DoubleNestedConfigurer(), Customizer.withDefaults());
187+
}
188+
189+
}
190+
191+
private static class DoubleNestedConfigurer
192+
extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {
193+
194+
}
195+
166196
private static class ApplyAndRemoveSecurityConfigurer
167197
extends SecurityConfigurerAdapter<Object, TestConfiguredSecurityBuilder> {
168198

0 commit comments

Comments
 (0)