EnableWebFluxSecurity uses PasswordEncoder Bean
This commit is contained in:
parent
895f0d108c
commit
be0081290b
|
@ -26,6 +26,7 @@ import org.springframework.security.authentication.ReactiveAuthenticationManager
|
|||
import org.springframework.security.authentication.UserDetailsRepositoryAuthenticationManager;
|
||||
import org.springframework.security.config.web.server.HttpSecurity;
|
||||
import org.springframework.security.core.userdetails.UserDetailsRepository;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.web.reactive.result.method.annotation.AuthenticationPrincipalArgumentResolver;
|
||||
import org.springframework.security.web.server.context.WebSessionSecurityContextRepository;
|
||||
import org.springframework.web.reactive.config.WebFluxConfigurer;
|
||||
|
@ -50,6 +51,9 @@ public class HttpSecurityConfiguration implements WebFluxConfigurer {
|
|||
@Autowired(required = false)
|
||||
private UserDetailsRepository userDetailsRepository;
|
||||
|
||||
@Autowired(required = false)
|
||||
private PasswordEncoder passwordEncoder;
|
||||
|
||||
@Override
|
||||
public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
|
||||
configurer.addCustomResolver(authenticationPrincipalArgumentResolver());
|
||||
|
@ -57,7 +61,7 @@ public class HttpSecurityConfiguration implements WebFluxConfigurer {
|
|||
|
||||
@Bean
|
||||
public AuthenticationPrincipalArgumentResolver authenticationPrincipalArgumentResolver() {
|
||||
return new AuthenticationPrincipalArgumentResolver(adapterRegistry);
|
||||
return new AuthenticationPrincipalArgumentResolver(this.adapterRegistry);
|
||||
}
|
||||
|
||||
@Bean(HTTPSECURITY_BEAN_NAME)
|
||||
|
@ -71,11 +75,16 @@ public class HttpSecurityConfiguration implements WebFluxConfigurer {
|
|||
}
|
||||
|
||||
private ReactiveAuthenticationManager authenticationManager() {
|
||||
if(authenticationManager != null) {
|
||||
return authenticationManager;
|
||||
if(this.authenticationManager != null) {
|
||||
return this.authenticationManager;
|
||||
}
|
||||
if(userDetailsRepository != null) {
|
||||
return new UserDetailsRepositoryAuthenticationManager(userDetailsRepository);
|
||||
if(this.userDetailsRepository != null) {
|
||||
UserDetailsRepositoryAuthenticationManager manager =
|
||||
new UserDetailsRepositoryAuthenticationManager(this.userDetailsRepository);
|
||||
if(this.passwordEncoder != null) {
|
||||
manager.setPasswordEncoder(this.passwordEncoder);
|
||||
}
|
||||
return manager;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -33,6 +33,8 @@ import org.springframework.security.core.Authentication;
|
|||
import org.springframework.security.core.userdetails.MapUserDetailsRepository;
|
||||
import org.springframework.security.core.userdetails.User;
|
||||
import org.springframework.security.core.userdetails.UserDetailsRepository;
|
||||
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
|
||||
import org.springframework.security.crypto.password.PasswordEncoder;
|
||||
import org.springframework.security.test.web.reactive.server.WebTestClientBuilder;
|
||||
import org.springframework.security.web.server.SecurityWebFilterChain;
|
||||
import org.springframework.security.web.server.WebFilterChainFilter;
|
||||
|
@ -127,6 +129,51 @@ public class EnableWebFluxSecurityTests {
|
|||
}
|
||||
}
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
public static class CustomPasswordEncoder {
|
||||
@Autowired
|
||||
WebFilterChainFilter springSecurityFilterChain;
|
||||
|
||||
@Test
|
||||
public void passwordEncoderBeanIsUsed() {
|
||||
WebTestClient client = WebTestClientBuilder.bindToWebFilters(
|
||||
springSecurityFilterChain,
|
||||
(exchange,chain) ->
|
||||
Mono.currentContext()
|
||||
.flatMap( c -> c.<Mono<Principal>>get(Authentication.class))
|
||||
.flatMap( principal -> exchange.getResponse()
|
||||
.writeWith(Mono.just(toDataBuffer(principal.getName()))))
|
||||
)
|
||||
.filter(basicAuthentication())
|
||||
.build();
|
||||
|
||||
client
|
||||
.get()
|
||||
.uri("/")
|
||||
.attributes(basicAuthenticationCredentials("user","password"))
|
||||
.exchange()
|
||||
.expectStatus().isOk()
|
||||
.expectBody(String.class).consumeWith( result -> assertThat(result.getResponseBody()).isEqualTo("user"));
|
||||
}
|
||||
|
||||
@EnableWebFluxSecurity
|
||||
static class Config {
|
||||
@Bean
|
||||
public UserDetailsRepository userDetailsRepository(PasswordEncoder encoder) {
|
||||
return new MapUserDetailsRepository(User.withUsername("user")
|
||||
.password(encoder.encode("password"))
|
||||
.roles("USER")
|
||||
.build()
|
||||
);
|
||||
}
|
||||
|
||||
@Bean
|
||||
public PasswordEncoder passwordEncoder() {
|
||||
return new BCryptPasswordEncoder();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@RunWith(SpringRunner.class)
|
||||
public static class MultiHttpSecurity {
|
||||
@Autowired
|
||||
|
|
Loading…
Reference in New Issue