Improve conditions for enabling WebFlux security
This commit correct a mistake where AuthenticationManager was used instead of ReactiveAuthenticationManager. It also expands the conditions so that WebFlux security will be enabled when the user has defined their own SecurityWebFilterChain. In such a situation no other security-related beans may be needed to use WebFlux security as things may have been configured directly using the DSL. Closes gh-37504
This commit is contained in:
		
							parent
							
								
									ff99de49c4
								
							
						
					
					
						commit
						4493958f13
					
				|  | @ -29,9 +29,10 @@ import org.springframework.boot.autoconfigure.security.SecurityProperties; | |||
| import org.springframework.boot.context.properties.EnableConfigurationProperties; | ||||
| import org.springframework.context.annotation.Conditional; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.security.authentication.AuthenticationManager; | ||||
| import org.springframework.security.authentication.ReactiveAuthenticationManager; | ||||
| import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; | ||||
| import org.springframework.security.core.userdetails.ReactiveUserDetailsService; | ||||
| import org.springframework.security.web.server.SecurityWebFilterChain; | ||||
| import org.springframework.security.web.server.WebFilterChainProxy; | ||||
| import org.springframework.web.reactive.config.WebFluxConfigurer; | ||||
| 
 | ||||
|  | @ -54,20 +55,20 @@ public class ReactiveSecurityAutoConfiguration { | |||
| 	@Configuration(proxyBeanMethods = false) | ||||
| 	@ConditionalOnMissingBean(WebFilterChainProxy.class) | ||||
| 	@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) | ||||
| 	@Conditional(ReactiveAuthenticationManagerCondition.class) | ||||
| 	@Conditional(EnableWebFluxSecurityCondition.class) | ||||
| 	@EnableWebFluxSecurity | ||||
| 	static class EnableWebFluxSecurityConfiguration { | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| 	static final class ReactiveAuthenticationManagerCondition extends AnyNestedCondition { | ||||
| 	static final class EnableWebFluxSecurityCondition extends AnyNestedCondition { | ||||
| 
 | ||||
| 		ReactiveAuthenticationManagerCondition() { | ||||
| 		EnableWebFluxSecurityCondition() { | ||||
| 			super(ConfigurationPhase.REGISTER_BEAN); | ||||
| 		} | ||||
| 
 | ||||
| 		@ConditionalOnBean(AuthenticationManager.class) | ||||
| 		static final class ConditionalOnAuthenticationManagerBean { | ||||
| 		@ConditionalOnBean(ReactiveAuthenticationManager.class) | ||||
| 		static final class ConditionalOnReactiveAuthenticationManagerBean { | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
|  | @ -76,6 +77,11 @@ public class ReactiveSecurityAutoConfiguration { | |||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 		@ConditionalOnBean(SecurityWebFilterChain.class) | ||||
| 		static final class ConditionalOnSecurityWebFilterChain { | ||||
| 
 | ||||
| 		} | ||||
| 
 | ||||
| 	} | ||||
| 
 | ||||
| } | ||||
|  |  | |||
|  | @ -25,9 +25,11 @@ import org.springframework.boot.test.context.FilteredClassLoader; | |||
| import org.springframework.boot.test.context.runner.ReactiveWebApplicationContextRunner; | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.security.authentication.ReactiveAuthenticationManager; | ||||
| import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; | ||||
| import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; | ||||
| import org.springframework.security.core.userdetails.User; | ||||
| import org.springframework.security.web.server.SecurityWebFilterChain; | ||||
| import org.springframework.security.web.server.WebFilterChainProxy; | ||||
| import org.springframework.web.reactive.config.WebFluxConfigurer; | ||||
| 
 | ||||
|  | @ -57,11 +59,24 @@ class ReactiveSecurityAutoConfigurationTests { | |||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void enablesWebFluxSecurity() { | ||||
| 	void enablesWebFluxSecurityWhenUserDetailsServiceIsPresent() { | ||||
| 		this.contextRunner.withUserConfiguration(UserDetailsServiceConfiguration.class) | ||||
| 			.run((context) -> assertThat(context).getBean(WebFilterChainProxy.class).isNotNull()); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void enablesWebFluxSecurityWhenReactiveAuthenticationManagerIsPresent() { | ||||
| 		this.contextRunner | ||||
| 			.withBean(ReactiveAuthenticationManager.class, () -> mock(ReactiveAuthenticationManager.class)) | ||||
| 			.run((context) -> assertThat(context).getBean(WebFilterChainProxy.class).isNotNull()); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void enablesWebFluxSecurityWhenSecurityWebFilterChainIsPresent() { | ||||
| 		this.contextRunner.withBean(SecurityWebFilterChain.class, () -> mock(SecurityWebFilterChain.class)) | ||||
| 			.run((context) -> assertThat(context).getBean(WebFilterChainProxy.class).isNotNull()); | ||||
| 	} | ||||
| 
 | ||||
| 	@Test | ||||
| 	void autoConfigurationIsConditionalOnClass() { | ||||
| 		this.contextRunner | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue