Skip to content

Commit a66b945

Browse files
committed
Configuration for ReactiveUserDetailsPasswordService
Issue: gh-2778
1 parent 72a267a commit a66b945

File tree

4 files changed

+33
-3
lines changed

4 files changed

+33
-3
lines changed

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

+5
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.springframework.security.authentication.ReactiveAuthenticationManager;
2929
import org.springframework.security.authentication.UserDetailsRepositoryReactiveAuthenticationManager;
3030
import org.springframework.security.config.web.server.ServerHttpSecurity;
31+
import org.springframework.security.core.userdetails.ReactiveUserDetailsPasswordService;
3132
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
3233
import org.springframework.security.crypto.password.PasswordEncoder;
3334
import org.springframework.security.web.reactive.result.method.annotation.AuthenticationPrincipalArgumentResolver;
@@ -54,6 +55,9 @@ class ServerHttpSecurityConfiguration implements WebFluxConfigurer {
5455
@Autowired(required = false)
5556
private PasswordEncoder passwordEncoder;
5657

58+
@Autowired(required = false)
59+
private ReactiveUserDetailsPasswordService userDetailsPasswordService;
60+
5761
@Autowired(required = false)
5862
private BeanFactory beanFactory;
5963

@@ -92,6 +96,7 @@ private ReactiveAuthenticationManager authenticationManager() {
9296
if(this.passwordEncoder != null) {
9397
manager.setPasswordEncoder(this.passwordEncoder);
9498
}
99+
manager.setUserDetailsPasswordService(this.userDetailsPasswordService);
95100
return manager;
96101
}
97102
return null;

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

+28
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,34 @@ public static PasswordEncoder passwordEncoder() {
237237
}
238238
}
239239

240+
@Test
241+
public void passwordUpdateManagerUsed() {
242+
this.spring.register(MapReactiveUserDetailsServiceConfig.class).autowire();
243+
WebTestClient client = WebTestClientBuilder.bindToWebFilters(this.springSecurityFilterChain).build();
244+
245+
client
246+
.get()
247+
.uri("/")
248+
.headers(h -> h.setBasicAuth("user", "password"))
249+
.exchange()
250+
.expectStatus().isOk();
251+
252+
ReactiveUserDetailsService users = this.spring.getContext().getBean(ReactiveUserDetailsService.class);
253+
assertThat(users.findByUsername("user").block().getPassword()).startsWith("{bcrypt}");
254+
}
255+
256+
@EnableWebFluxSecurity
257+
static class MapReactiveUserDetailsServiceConfig {
258+
@Bean
259+
public MapReactiveUserDetailsService userDetailsService() {
260+
return new MapReactiveUserDetailsService(User.withUsername("user")
261+
.password("{noop}password")
262+
.roles("USER")
263+
.build()
264+
);
265+
}
266+
}
267+
240268
@Test
241269
public void formLoginWorks() {
242270
this.spring.register(Config.class).autowire();

core/src/main/java/org/springframework/security/authentication/UserDetailsRepositoryReactiveAuthenticationManager.java

-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@
2020

2121
import org.springframework.security.core.userdetails.ReactiveUserDetailsPasswordService;
2222
import org.springframework.security.core.userdetails.ReactiveUserDetailsService;
23-
import org.springframework.security.core.userdetails.User;
2423
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
2524
import org.springframework.security.crypto.password.PasswordEncoder;
2625
import org.springframework.util.Assert;

core/src/test/java/org/springframework/security/authentication/UserDetailsRepositoryReactiveAuthenticationManagerTests.java

-2
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,6 @@ public void authenticateWhenPasswordServiceThenUpdated() {
115115
public void authenticateWhenPasswordServiceAndBadCredentialsThenNotUpdated() {
116116
when(this.userDetailsService.findByUsername(any())).thenReturn(Mono.just(this.user));
117117
when(this.encoder.matches(any(), any())).thenReturn(false);
118-
when(this.userDetailsPasswordService.updatePassword(any(), any())).thenReturn(Mono.just(this.user));
119118
this.manager.setPasswordEncoder(this.encoder);
120119
this.manager.setUserDetailsPasswordService(this.userDetailsPasswordService);
121120
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
@@ -132,7 +131,6 @@ public void authenticateWhenPasswordServiceAndUpgradeFalseThenNotUpdated() {
132131
when(this.userDetailsService.findByUsername(any())).thenReturn(Mono.just(this.user));
133132
when(this.encoder.matches(any(), any())).thenReturn(true);
134133
when(this.encoder.upgradeEncoding(any())).thenReturn(false);
135-
when(this.userDetailsPasswordService.updatePassword(any(), any())).thenReturn(Mono.just(this.user));
136134
this.manager.setPasswordEncoder(this.encoder);
137135
this.manager.setUserDetailsPasswordService(this.userDetailsPasswordService);
138136
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(

0 commit comments

Comments
 (0)