Skip to content

Commit d385b53

Browse files
Merge branch '6.1.x' into 6.2.x
2 parents dd20f06 + 92af758 commit d385b53

File tree

7 files changed

+55
-121
lines changed

7 files changed

+55
-121
lines changed

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

Lines changed: 40 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,12 @@
2929
import org.springframework.beans.BeanMetadataElement;
3030
import org.springframework.beans.BeansException;
3131
import org.springframework.beans.factory.FactoryBean;
32-
import org.springframework.beans.factory.aot.BeanRegistrationExcludeFilter;
3332
import org.springframework.beans.factory.config.BeanDefinition;
3433
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
3534
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
3635
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
3736
import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor;
3837
import org.springframework.beans.factory.support.ManagedList;
39-
import org.springframework.beans.factory.support.RegisteredBean;
4038
import org.springframework.context.ApplicationContext;
4139
import org.springframework.context.ApplicationContextAware;
4240
import org.springframework.context.annotation.Bean;
@@ -113,86 +111,67 @@ public void setApplicationContext(ApplicationContext applicationContext) throws
113111
}
114112
}
115113

116-
@Bean
117-
static SpringSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor springSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor() {
118-
return new SpringSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor();
119-
}
120-
121114
/**
122-
* Used to ensure Spring MVC request matching is cached. Creates a
123-
* {@link BeanDefinitionRegistryPostProcessor} that detects if a bean named
115+
* Used to ensure Spring MVC request matching is cached.
116+
*
117+
* Creates a {@link BeanDefinitionRegistryPostProcessor} that detects if a bean named
124118
* HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME is defined. If so, it moves the
125119
* AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME to another bean name
126120
* and then adds a {@link CompositeFilter} that contains
127121
* {@link HandlerMappingIntrospector#createCacheFilter()} and the original
128122
* FilterChainProxy under the original Bean name.
129-
*
130123
* @return
131124
*/
132-
static class SpringSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor
133-
implements BeanDefinitionRegistryPostProcessor {
134-
135-
@Override
136-
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
137-
if (!registry.containsBeanDefinition(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME)) {
138-
return;
125+
@Bean
126+
static BeanDefinitionRegistryPostProcessor springSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor() {
127+
return new BeanDefinitionRegistryPostProcessor() {
128+
@Override
129+
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
139130
}
140131

141-
BeanDefinition hmiRequestTransformer = BeanDefinitionBuilder
142-
.rootBeanDefinition(HandlerMappingIntrospectorRequestTransformer.class)
143-
.addConstructorArgReference(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME)
144-
.getBeanDefinition();
145-
registry.registerBeanDefinition(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME + "RequestTransformer",
146-
hmiRequestTransformer);
147-
148-
BeanDefinition filterChainProxy = registry
149-
.getBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
150-
151-
BeanDefinitionBuilder hmiCacheFilterBldr = BeanDefinitionBuilder
152-
.rootBeanDefinition(HandlerMappingIntrospectorCachFilterFactoryBean.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-
}
166-
167-
@Override
168-
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
132+
@Override
133+
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
134+
if (!registry.containsBeanDefinition(HANDLER_MAPPING_INTROSPECTOR_BEAN_NAME)) {
135+
return;
136+
}
169137

170-
}
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+
}
171146

172-
}
147+
BeanDefinition filterChainProxy = registry
148+
.getBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
173149

174-
/**
175-
* Used to exclude the
176-
* {@link SpringSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor}
177-
* from AOT processing. See <a href=
178-
* "https://github.com/spring-projects/spring-security/issues/14362">gh-14362</a>
179-
*/
180-
static class SpringSecurityHandlerMappingIntrospectorBeanRegistrationExcludeFilter
181-
implements BeanRegistrationExcludeFilter {
150+
if (!filterChainProxy.getResolvableType().isInstance(CompositeFilterChainProxy.class)) {
151+
BeanDefinitionBuilder hmiCacheFilterBldr = BeanDefinitionBuilder
152+
.rootBeanDefinition(HandlerMappingIntrospectorCacheFilterFactoryBean.class)
153+
.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);
182154

183-
@Override
184-
public boolean isExcludedFromAotProcessing(RegisteredBean registeredBean) {
185-
Class<?> beanClass = registeredBean.getBeanClass();
186-
return SpringSecurityHandlerMappingIntrospectorBeanDefinitionRegistryPostProcessor.class == beanClass;
187-
}
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);
188161

162+
registry.removeBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME);
163+
registry.registerBeanDefinition(AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME,
164+
compositeSpringSecurityFilterChainBldr.getBeanDefinition());
165+
}
166+
}
167+
};
189168
}
190169

191170
/**
192171
* {@link FactoryBean} to defer creation of
193172
* {@link HandlerMappingIntrospector#createCacheFilter()}
194173
*/
195-
static class HandlerMappingIntrospectorCachFilterFactoryBean
174+
static class HandlerMappingIntrospectorCacheFilterFactoryBean
196175
implements ApplicationContextAware, FactoryBean<Filter> {
197176

198177
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/main/resources/META-INF/spring/aot.factories

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,3 @@ org.springframework.security.config.annotation.authentication.configuration.Auth
44
org.springframework.aot.hint.RuntimeHintsRegistrar=\
55
org.springframework.security.config.aot.hint.OAuth2LoginRuntimeHints,\
66
org.springframework.security.config.aot.hint.WebMvcSecurityConfigurationRuntimeHints
7-
8-
org.springframework.beans.factory.aot.BeanRegistrationExcludeFilter=\
9-
org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration.SpringSecurityHandlerMappingIntrospectorBeanRegistrationExcludeFilter

config/src/test/java/org/springframework/security/config/annotation/web/configuration/SpringSecurityHandlerMappingIntrospectorBeanRegistrationExcludeFilterTests.java

Lines changed: 0 additions & 53 deletions
This file was deleted.

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)