Skip to content

Commit cf142ef

Browse files
committed
Delay AuthenticationPrincipalArgumentResolver Creation
Use ObjectProvider<AuthenticationPrincipalArgumentResolver> to delay its lookup. Closes gh-8613
1 parent 258bd8f commit cf142ef

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

config/src/main/java/org/springframework/security/config/annotation/web/reactive/ServerHttpSecurityConfiguration.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.springframework.beans.BeansException;
2020
import org.springframework.beans.factory.BeanFactory;
21+
import org.springframework.beans.factory.ObjectProvider;
2122
import org.springframework.beans.factory.annotation.Autowired;
2223
import org.springframework.context.ApplicationContext;
2324
import org.springframework.context.ApplicationContextAware;
@@ -87,11 +88,11 @@ void setUserDetailsPasswordService(ReactiveUserDetailsPasswordService userDetail
8788

8889
@Bean
8990
public WebFluxConfigurer authenticationPrincipalArgumentResolverConfigurer(
90-
AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver) {
91+
ObjectProvider<AuthenticationPrincipalArgumentResolver> authenticationPrincipalArgumentResolver) {
9192
return new WebFluxConfigurer() {
9293
@Override
9394
public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
94-
configurer.addCustomResolver(authenticationPrincipalArgumentResolver);
95+
configurer.addCustomResolver(authenticationPrincipalArgumentResolver.getObject());
9596
}
9697
};
9798
}

config/src/test/java/org/springframework/security/config/annotation/web/reactive/EnableWebFluxSecurityTests.java

+21
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
import org.springframework.security.test.context.annotation.SecurityTestExecutionListeners;
4848
import org.springframework.security.test.context.support.WithMockUser;
4949
import org.springframework.security.test.web.reactive.server.WebTestClientBuilder;
50+
import org.springframework.security.web.reactive.result.method.annotation.AuthenticationPrincipalArgumentResolver;
5051
import org.springframework.security.web.reactive.result.view.CsrfRequestDataValueProcessor;
5152
import org.springframework.security.web.server.SecurityWebFilterChain;
5253
import org.springframework.security.web.server.WebFilterChainProxy;
@@ -59,6 +60,7 @@
5960
import org.springframework.util.MultiValueMap;
6061
import org.springframework.web.bind.annotation.GetMapping;
6162
import org.springframework.web.bind.annotation.RestController;
63+
import org.springframework.web.reactive.config.DelegatingWebFluxConfiguration;
6264
import org.springframework.web.reactive.config.EnableWebFlux;
6365
import org.springframework.web.reactive.function.BodyInserters;
6466
import org.springframework.web.reactive.result.view.AbstractView;
@@ -434,4 +436,23 @@ static class Child {
434436
Child() {
435437
}
436438
}
439+
440+
@Test
441+
// gh-8596
442+
public void resolveAuthenticationPrincipalArgumentResolverFirstDoesNotCauseBeanCurrentlyInCreationException() {
443+
this.spring.register(EnableWebFluxSecurityConfiguration.class,
444+
ReactiveAuthenticationTestConfiguration.class,
445+
DelegatingWebFluxConfiguration.class).autowire();
446+
}
447+
448+
@EnableWebFluxSecurity
449+
@Configuration(proxyBeanMethods = false)
450+
static class EnableWebFluxSecurityConfiguration {
451+
/**
452+
* It is necessary to Autowire AuthenticationPrincipalArgumentResolver because it triggers eager loading of
453+
* AuthenticationPrincipalArgumentResolver bean which causes BeanCurrentlyInCreationException
454+
*/
455+
@Autowired
456+
AuthenticationPrincipalArgumentResolver resolver;
457+
}
437458
}

0 commit comments

Comments
 (0)