Skip to content

Commit 92af758

Browse files
Make springSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor passive
Instead of excluding the bean from AOT processing, we avoid redefining the beans if they are present or in the expected state. Issue gh-14362
1 parent 778a63a commit 92af758

File tree

5 files changed

+40
-25
lines changed

5 files changed

+40
-25
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/configuration/WebMvcSecurityConfiguration.java

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -135,30 +135,34 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t
135135
return;
136136
}
137137

138-
BeanDefinition hmiRequestTransformer = BeanDefinitionBuilder
139-
.rootBeanDefinition(HandlerMappingIntrospectorRequestTransformer.class)
140-
.addConstructorArgReference(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME)
141-
.getBeanDefinition();
142-
registry.registerBeanDefinition(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME + "RequestTransformer",
143-
hmiRequestTransformer);
138+
String hmiRequestTransformerBeanName = HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME + "RequestTransformer";
139+
if (!registry.containsBeanDefinition(hmiRequestTransformerBeanName)) {
140+
BeanDefinition hmiRequestTransformer = BeanDefinitionBuilder
141+
.rootBeanDefinition(HandlerMappingIntrospectorRequestTransformer.class)
142+
.addConstructorArgReference(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME)
143+
.getBeanDefinition();
144+
registry.registerBeanDefinition(hmiRequestTransformerBeanName, hmiRequestTransformer);
145+
}
144146

145147
BeanDefinition filterChainProxy = registry
146148
.getBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
147149

148-
BeanDefinitionBuilder hmiCacheFilterBldr = BeanDefinitionBuilder
149-
.rootBeanDefinition(HandlerMappingIntrospectorCachFilterFactoryBean.class)
150-
.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
151-
152-
ManagedList<BeanMetadataElement> filters = new ManagedList<>();
153-
filters.add(hmiCacheFilterBldr.getBeanDefinition());
154-
filters.add(filterChainProxy);
155-
BeanDefinitionBuilder compositeSpringSecurityFilterChainBldr = BeanDefinitionBuilder
156-
.rootBeanDefinition(CompositeFilterChainProxy.class)
157-
.addConstructorArgValue(filters);
158-
159-
registry.removeBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
160-
registry.registerBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME,
161-
compositeSpringSecurityFilterChainBldr.getBeanDefinition());
150+
if (!filterChainProxy.getResolvableType().isInstance(CompositeFilterChainProxy.class)) {
151+
BeanDefinitionBuilder hmiCacheFilterBldr = BeanDefinitionBuilder
152+
.rootBeanDefinition(HandlerMappingIntrospectorCacheFilterFactoryBean.class)
153+
.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
154+
155+
ManagedList<BeanMetadataElement> filters = new ManagedList<>();
156+
filters.add(hmiCacheFilterBldr.getBeanDefinition());
157+
filters.add(filterChainProxy);
158+
BeanDefinitionBuilder compositeSpringSecurityFilterChainBldr = BeanDefinitionBuilder
159+
.rootBeanDefinition(CompositeFilterChainProxy.class)
160+
.addConstructorArgValue(filters);
161+
162+
registry.removeBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
163+
registry.registerBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME,
164+
compositeSpringSecurityFilterChainBldr.getBeanDefinition());
165+
}
162166
}
163167
};
164168
}
@@ -167,7 +171,7 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t
167171
* {@link FactoryBean} to defer creation of
168172
* {@link HandlerMappingIntrospector#createCacheFilter()}
169173
*/
170-
static class HandlerMappingIntrospectorCachFilterFactoryBean
174+
static class HandlerMappingIntrospectorCacheFilterFactoryBean
171175
implements ApplicationContextAware, FactoryBean<Filter> {
172176

173177
private ApplicationContext applicationContext;

config/src/main/java/org/springframework/security/config/aot/hint/WebMvcSecurityConfigurationRuntimeHints.java

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,11 @@ public void registerHints(RuntimeHints hints, ClassLoader classLoader) {
3434
hints.reflection()
3535
.registerType(TypeReference
3636
.of("org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy"),
37-
MemberCategory.INVOKE_DECLARED_METHODS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
37+
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
38+
hints.reflection()
39+
.registerType(TypeReference
40+
.of("org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$HandlerMappingIntrospectorCacheFilterFactoryBean"),
41+
MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
3842
}
3943

4044
}

config/src/test/java/org/springframework/security/config/aot/hint/WebMvcSecurityConfigurationRuntimeHintsTests.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,12 @@ void compositeFilterChainProxyHasHints() {
5353
.withMemberCategory(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)).accepts(this.hints);
5454
}
5555

56+
@Test
57+
void handlerMappingIntrospectorCacheFilterFactoryBeanHasHints() {
58+
assertThat(RuntimeHintsPredicates.reflection()
59+
.onType(TypeReference
60+
.of("org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$HandlerMappingIntrospectorCacheFilterFactoryBean"))
61+
.withMemberCategory(MemberCategory.INVOKE_DECLARED_CONSTRUCTORS)).accepts(this.hints);
62+
}
63+
5664
}

test/src/main/java/org/springframework/security/test/aot/hint/WebTestUtilsTestRuntimeHints.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ private void registerFilterChainProxyHints(RuntimeHints hints) {
5050
hints.reflection()
5151
.registerType(TypeReference
5252
.of("org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy"),
53-
MemberCategory.INVOKE_DECLARED_METHODS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS);
53+
MemberCategory.INVOKE_DECLARED_METHODS);
5454
}
5555

5656
private void registerCsrfTokenRepositoryHints(RuntimeHints hints) {

test/src/test/java/org/springframework/security/test/aot/hint/WebTestUtilsTestRuntimeHintsTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,7 @@ void compositeFilterChainProxyHasHints() {
6262
assertThat(RuntimeHintsPredicates.reflection()
6363
.onType(TypeReference
6464
.of("org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration$CompositeFilterChainProxy"))
65-
.withMemberCategories(MemberCategory.INVOKE_DECLARED_METHODS, MemberCategory.INVOKE_DECLARED_CONSTRUCTORS))
66-
.accepts(this.hints);
65+
.withMemberCategory(MemberCategory.INVOKE_DECLARED_METHODS)).accepts(this.hints);
6766
}
6867

6968
@Test

0 commit comments

Comments
 (0)