From 4681697581e582337a5f2bb3e66bc740025b8fc5 Mon Sep 17 00:00:00 2001 From: Rob Winch Date: Tue, 10 Oct 2017 09:46:15 -0500 Subject: [PATCH] UserDetailsRepository->ReactiveUserDetailsService Issue gh-4615 --- .../reactive/HttpSecurityConfiguration.java | 8 +++--- ...serDetailsServiceResourceFactoryBean.java} | 25 ++++++++++--------- .../reactive/EnableWebFluxSecurityTests.java | 20 +++++++-------- ...eFactoryBeanPropertiesResourceITests.java} | 11 ++++---- ...BeanPropertiesResourceLocationITests.java} | 12 ++++----- ...rviceResourceFactoryBeanStringITests.java} | 11 ++++---- .../config/web/server/FormLoginTests.java | 4 +-- .../config/web/server/LogoutBuilderTests.java | 4 +-- ...etailsRepositoryAuthenticationManager.java | 12 ++++----- ...ava => MapReactiveUserDetailsService.java} | 10 ++++---- ...y.java => ReactiveUserDetailsService.java} | 2 +- ...ilsServiceAuthenticationManagerTests.java} | 9 +++---- ...> MapReactiveUserDetailsServiceTests.java} | 11 +++----- .../src/main/java/sample/SecurityConfig.java | 10 +++----- .../sample/HelloWebfluxSecurityConfig.java | 6 ++--- .../sample/HelloWebfluxFnSecurityConfig.java | 6 ++--- 16 files changed, 74 insertions(+), 87 deletions(-) rename config/src/main/java/org/springframework/security/config/core/userdetails/{UserDetailsRepositoryResourceFactoryBean.java => ReactiveUserDetailsServiceResourceFactoryBean.java} (74%) rename config/src/test/java/org/springframework/security/config/core/userdetails/{UserDetailsRepositoryResourceFactoryBeanPropertiesResourceITests.java => ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceITests.java} (77%) rename config/src/test/java/org/springframework/security/config/core/userdetails/{UserDetailsRepositoryResourceFactoryBeanStringITests.java => ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceLocationITests.java} (76%) rename config/src/test/java/org/springframework/security/config/core/userdetails/{UserDetailsRepositoryResourceFactoryBeanPropertiesResourceLocationITests.java => ReactiveUserDetailsServiceResourceFactoryBeanStringITests.java} (77%) rename core/src/main/java/org/springframework/security/core/userdetails/{MapUserDetailsRepository.java => MapReactiveUserDetailsService.java} (78%) rename core/src/main/java/org/springframework/security/core/userdetails/{UserDetailsRepository.java => ReactiveUserDetailsService.java} (94%) rename core/src/test/java/org/springframework/security/authentication/{UserDetailsRepositoryAuthenticationManagerTests.java => ReactiveUserDetailsServiceAuthenticationManagerTests.java} (95%) rename core/src/test/java/org/springframework/security/core/userdetails/{MapUserDetailsRepositoryTests.java => MapReactiveUserDetailsServiceTests.java} (83%) diff --git a/config/src/main/java/org/springframework/security/config/annotation/web/reactive/HttpSecurityConfiguration.java b/config/src/main/java/org/springframework/security/config/annotation/web/reactive/HttpSecurityConfiguration.java index 926e1aa000..997d962466 100644 --- a/config/src/main/java/org/springframework/security/config/annotation/web/reactive/HttpSecurityConfiguration.java +++ b/config/src/main/java/org/springframework/security/config/annotation/web/reactive/HttpSecurityConfiguration.java @@ -23,7 +23,7 @@ import org.springframework.core.ReactiveAdapterRegistry; 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.core.userdetails.ReactiveUserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.web.reactive.result.method.annotation.AuthenticationPrincipalArgumentResolver; import org.springframework.web.reactive.config.WebFluxConfigurer; @@ -46,7 +46,7 @@ public class HttpSecurityConfiguration implements WebFluxConfigurer { private ReactiveAuthenticationManager authenticationManager; @Autowired(required = false) - private UserDetailsRepository userDetailsRepository; + private ReactiveUserDetailsService reactiveUserDetailsService; @Autowired(required = false) private PasswordEncoder passwordEncoder; @@ -76,9 +76,9 @@ public class HttpSecurityConfiguration implements WebFluxConfigurer { if(this.authenticationManager != null) { return this.authenticationManager; } - if(this.userDetailsRepository != null) { + if(this.reactiveUserDetailsService != null) { UserDetailsRepositoryAuthenticationManager manager = - new UserDetailsRepositoryAuthenticationManager(this.userDetailsRepository); + new UserDetailsRepositoryAuthenticationManager(this.reactiveUserDetailsService); if(this.passwordEncoder != null) { manager.setPasswordEncoder(this.passwordEncoder); } diff --git a/config/src/main/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBean.java b/config/src/main/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBean.java similarity index 74% rename from config/src/main/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBean.java rename to config/src/main/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBean.java index 02dc04a25d..5b3f6bd74c 100644 --- a/config/src/main/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBean.java +++ b/config/src/main/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBean.java @@ -20,31 +20,32 @@ import org.springframework.beans.factory.FactoryBean; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.util.InMemoryResource; import java.util.Collection; /** - * Constructs an {@link MapUserDetailsRepository} from a resource using {@link UserDetailsResourceFactoryBean}. + * Constructs an {@link MapReactiveUserDetailsService} from a resource using {@link UserDetailsResourceFactoryBean}. * * @author Rob Winch * @since 5.0 * @see UserDetailsResourceFactoryBean */ -public class UserDetailsRepositoryResourceFactoryBean implements ResourceLoaderAware, FactoryBean { +public class ReactiveUserDetailsServiceResourceFactoryBean + implements ResourceLoaderAware, FactoryBean { private UserDetailsResourceFactoryBean userDetails = new UserDetailsResourceFactoryBean(); @Override - public MapUserDetailsRepository getObject() throws Exception { + public MapReactiveUserDetailsService getObject() throws Exception { Collection users = userDetails.getObject(); - return new MapUserDetailsRepository(users); + return new MapReactiveUserDetailsService(users); } @Override public Class getObjectType() { - return MapUserDetailsRepository.class; + return MapReactiveUserDetailsService.class; } @Override @@ -78,8 +79,8 @@ public class UserDetailsRepositoryResourceFactoryBean implements ResourceLoaderA * @param resourceLocatiton the location of the properties file that contains the users (i.e. "classpath:users.properties") * @return the UserDetailsResourceFactoryBean */ - public static UserDetailsRepositoryResourceFactoryBean fromResourceLocation(String resourceLocatiton) { - UserDetailsRepositoryResourceFactoryBean result = new UserDetailsRepositoryResourceFactoryBean(); + public static ReactiveUserDetailsServiceResourceFactoryBean fromResourceLocation(String resourceLocatiton) { + ReactiveUserDetailsServiceResourceFactoryBean result = new ReactiveUserDetailsServiceResourceFactoryBean(); result.setResourceLocation(resourceLocatiton); return result; } @@ -91,8 +92,8 @@ public class UserDetailsRepositoryResourceFactoryBean implements ResourceLoaderA * @param propertiesResource the Resource that is a properties file that contains the users * @return the UserDetailsResourceFactoryBean */ - public static UserDetailsRepositoryResourceFactoryBean fromResource(Resource propertiesResource) { - UserDetailsRepositoryResourceFactoryBean result = new UserDetailsRepositoryResourceFactoryBean(); + public static ReactiveUserDetailsServiceResourceFactoryBean fromResource(Resource propertiesResource) { + ReactiveUserDetailsServiceResourceFactoryBean result = new ReactiveUserDetailsServiceResourceFactoryBean(); result.setResource(propertiesResource); return result; } @@ -104,8 +105,8 @@ public class UserDetailsRepositoryResourceFactoryBean implements ResourceLoaderA * @param users the users in the format defined in {@link UserDetailsResourceFactoryBean} * @return the UserDetailsResourceFactoryBean */ - public static UserDetailsRepositoryResourceFactoryBean fromString(String users) { - UserDetailsRepositoryResourceFactoryBean result = new UserDetailsRepositoryResourceFactoryBean(); + public static ReactiveUserDetailsServiceResourceFactoryBean fromString(String users) { + ReactiveUserDetailsServiceResourceFactoryBean result = new ReactiveUserDetailsServiceResourceFactoryBean(); result.setResource(new InMemoryResource(users)); return result; } diff --git a/config/src/test/java/org/springframework/security/config/annotation/web/reactive/EnableWebFluxSecurityTests.java b/config/src/test/java/org/springframework/security/config/annotation/web/reactive/EnableWebFluxSecurityTests.java index 59d2d4865a..3cf3463fc6 100644 --- a/config/src/test/java/org/springframework/security/config/annotation/web/reactive/EnableWebFluxSecurityTests.java +++ b/config/src/test/java/org/springframework/security/config/annotation/web/reactive/EnableWebFluxSecurityTests.java @@ -28,9 +28,9 @@ import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.security.authentication.TestingAuthenticationToken; import org.springframework.security.config.web.server.HttpSecurity; import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetailsRepository; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.test.web.reactive.server.WebTestClientBuilder; @@ -138,8 +138,8 @@ public class EnableWebFluxSecurityTests { @EnableWebFluxSecurity static class Config { @Bean - public UserDetailsRepository userDetailsRepository() { - return new MapUserDetailsRepository(User.withUsername("user") + public ReactiveUserDetailsService userDetailsRepository() { + return new MapReactiveUserDetailsService(User.withUsername("user") .password("password") .roles("USER") .build() @@ -178,8 +178,8 @@ public class EnableWebFluxSecurityTests { @EnableWebFluxSecurity static class Config { @Bean - public UserDetailsRepository userDetailsRepository(PasswordEncoder encoder) { - return new MapUserDetailsRepository(User.withUsername("user") + public ReactiveUserDetailsService userDetailsRepository(PasswordEncoder encoder) { + return new MapReactiveUserDetailsService(User.withUsername("user") .password(encoder.encode("password")) .roles("USER") .build() @@ -226,8 +226,8 @@ public class EnableWebFluxSecurityTests { @EnableWebFluxSecurity static class Config { @Bean - public UserDetailsRepository userDetailsRepository() { - return new MapUserDetailsRepository(User.withUsername("user") + public ReactiveUserDetailsService userDetailsRepository() { + return new MapReactiveUserDetailsService(User.withUsername("user") .password("password") .roles("USER") .build() @@ -275,8 +275,8 @@ public class EnableWebFluxSecurityTests { } @Bean - public UserDetailsRepository userDetailsRepository() { - return new MapUserDetailsRepository(User.withUsername("user") + public ReactiveUserDetailsService userDetailsRepository() { + return new MapReactiveUserDetailsService(User.withUsername("user") .password("password") .roles("USER") .build() diff --git a/config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanPropertiesResourceITests.java b/config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceITests.java similarity index 77% rename from config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanPropertiesResourceITests.java rename to config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceITests.java index 0128b8405a..bb5888347c 100644 --- a/config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanPropertiesResourceITests.java +++ b/config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceITests.java @@ -22,7 +22,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.userdetails.UserDetailsRepository; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; import org.springframework.security.util.InMemoryResource; import org.springframework.test.context.junit4.SpringRunner; @@ -33,9 +33,8 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; * @since 5.0 */ @RunWith(SpringRunner.class) -public class UserDetailsRepositoryResourceFactoryBeanPropertiesResourceITests { - @Autowired - UserDetailsRepository users; +public class ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceITests { + @Autowired ReactiveUserDetailsService users; @Test public void loadUserByUsernameWhenUserFoundThenNotNull() { @@ -45,8 +44,8 @@ public class UserDetailsRepositoryResourceFactoryBeanPropertiesResourceITests { @Configuration static class Config { @Bean - public UserDetailsRepositoryResourceFactoryBean userDetailsService() { - return UserDetailsRepositoryResourceFactoryBean.fromResource(new InMemoryResource("user=password,ROLE_USER")); + public ReactiveUserDetailsServiceResourceFactoryBean userDetailsService() { + return ReactiveUserDetailsServiceResourceFactoryBean.fromResource(new InMemoryResource("user=password,ROLE_USER")); } } } diff --git a/config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanStringITests.java b/config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceLocationITests.java similarity index 76% rename from config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanStringITests.java rename to config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceLocationITests.java index 0da84bfc24..4ea98f05d6 100644 --- a/config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanStringITests.java +++ b/config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceLocationITests.java @@ -22,8 +22,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.userdetails.UserDetailsRepository; -import org.springframework.security.util.InMemoryResource; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @@ -33,9 +32,8 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; * @since 5.0 */ @RunWith(SpringRunner.class) -public class UserDetailsRepositoryResourceFactoryBeanStringITests { - @Autowired - UserDetailsRepository users; +public class ReactiveUserDetailsServiceResourceFactoryBeanPropertiesResourceLocationITests { + @Autowired ReactiveUserDetailsService users; @Test public void loadUserByUsernameWhenUserFoundThenNotNull() { @@ -45,8 +43,8 @@ public class UserDetailsRepositoryResourceFactoryBeanStringITests { @Configuration static class Config { @Bean - public UserDetailsRepositoryResourceFactoryBean userDetailsService() { - return UserDetailsRepositoryResourceFactoryBean.fromString("user=password,ROLE_USER"); + public ReactiveUserDetailsServiceResourceFactoryBean userDetailsService() { + return ReactiveUserDetailsServiceResourceFactoryBean.fromResourceLocation("classpath:users.properties"); } } } diff --git a/config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanPropertiesResourceLocationITests.java b/config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanStringITests.java similarity index 77% rename from config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanPropertiesResourceLocationITests.java rename to config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanStringITests.java index 3e4ceb5c07..0b7dc8ac03 100644 --- a/config/src/test/java/org/springframework/security/config/core/userdetails/UserDetailsRepositoryResourceFactoryBeanPropertiesResourceLocationITests.java +++ b/config/src/test/java/org/springframework/security/config/core/userdetails/ReactiveUserDetailsServiceResourceFactoryBeanStringITests.java @@ -22,7 +22,7 @@ import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.security.core.userdetails.UserDetailsRepository; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; import org.springframework.test.context.junit4.SpringRunner; import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; @@ -32,9 +32,8 @@ import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; * @since 5.0 */ @RunWith(SpringRunner.class) -public class UserDetailsRepositoryResourceFactoryBeanPropertiesResourceLocationITests { - @Autowired - UserDetailsRepository users; +public class ReactiveUserDetailsServiceResourceFactoryBeanStringITests { + @Autowired ReactiveUserDetailsService users; @Test public void loadUserByUsernameWhenUserFoundThenNotNull() { @@ -44,8 +43,8 @@ public class UserDetailsRepositoryResourceFactoryBeanPropertiesResourceLocationI @Configuration static class Config { @Bean - public UserDetailsRepositoryResourceFactoryBean userDetailsService() { - return UserDetailsRepositoryResourceFactoryBean.fromResourceLocation("classpath:users.properties"); + public ReactiveUserDetailsServiceResourceFactoryBean userDetailsService() { + return ReactiveUserDetailsServiceResourceFactoryBean.fromString("user=password,ROLE_USER"); } } } diff --git a/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java b/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java index 701db44e08..d069667370 100644 --- a/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java +++ b/config/src/test/java/org/springframework/security/config/web/server/FormLoginTests.java @@ -23,7 +23,7 @@ import org.openqa.selenium.support.FindBy; import org.openqa.selenium.support.PageFactory; import org.springframework.security.authentication.ReactiveAuthenticationManager; import org.springframework.security.authentication.UserDetailsRepositoryAuthenticationManager; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.htmlunit.server.WebTestClientHtmlUnitDriverBuilder; @@ -45,7 +45,7 @@ public class FormLoginTests { private UserDetails user = User.withUsername("user").password("password").roles("USER").build(); private HttpSecurity http = HttpSecurity.http(); - ReactiveAuthenticationManager manager = new UserDetailsRepositoryAuthenticationManager(new MapUserDetailsRepository(this.user)); + ReactiveAuthenticationManager manager = new UserDetailsRepositoryAuthenticationManager(new MapReactiveUserDetailsService(this.user)); @Test public void defaultLoginPage() { diff --git a/config/src/test/java/org/springframework/security/config/web/server/LogoutBuilderTests.java b/config/src/test/java/org/springframework/security/config/web/server/LogoutBuilderTests.java index d17e9cf833..2c8012c6cc 100644 --- a/config/src/test/java/org/springframework/security/config/web/server/LogoutBuilderTests.java +++ b/config/src/test/java/org/springframework/security/config/web/server/LogoutBuilderTests.java @@ -20,7 +20,7 @@ import org.junit.Test; import org.openqa.selenium.WebDriver; import org.springframework.security.authentication.ReactiveAuthenticationManager; import org.springframework.security.authentication.UserDetailsRepositoryAuthenticationManager; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.htmlunit.server.WebTestClientHtmlUnitDriverBuilder; @@ -37,7 +37,7 @@ public class LogoutBuilderTests { private UserDetails user = User.withUsername("user").password("password").roles("USER").build(); private HttpSecurity http = HttpSecurity.http(); - ReactiveAuthenticationManager manager = new UserDetailsRepositoryAuthenticationManager(new MapUserDetailsRepository(this.user)); + ReactiveAuthenticationManager manager = new UserDetailsRepositoryAuthenticationManager(new MapReactiveUserDetailsService(this.user)); @Test public void defaultLogout() { diff --git a/core/src/main/java/org/springframework/security/authentication/UserDetailsRepositoryAuthenticationManager.java b/core/src/main/java/org/springframework/security/authentication/UserDetailsRepositoryAuthenticationManager.java index a8434ef488..77af558768 100644 --- a/core/src/main/java/org/springframework/security/authentication/UserDetailsRepositoryAuthenticationManager.java +++ b/core/src/main/java/org/springframework/security/authentication/UserDetailsRepositoryAuthenticationManager.java @@ -16,11 +16,9 @@ package org.springframework.security.authentication; -import org.springframework.security.authentication.encoding.PlaintextPasswordEncoder; import org.springframework.security.core.Authentication; -import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsRepository; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; import org.springframework.security.crypto.password.NoOpPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.util.Assert; @@ -32,13 +30,13 @@ import reactor.core.scheduler.Schedulers; * @since 5.0 */ public class UserDetailsRepositoryAuthenticationManager implements ReactiveAuthenticationManager { - private final UserDetailsRepository repository; + private final ReactiveUserDetailsService repository; private PasswordEncoder passwordEncoder = NoOpPasswordEncoder.getInstance(); - public UserDetailsRepositoryAuthenticationManager(UserDetailsRepository userDetailsRepository) { - Assert.notNull(userDetailsRepository, "userDetailsRepository cannot be null"); - this.repository = userDetailsRepository; + public UserDetailsRepositoryAuthenticationManager(ReactiveUserDetailsService reactiveUserDetailsService) { + Assert.notNull(reactiveUserDetailsService, "userDetailsRepository cannot be null"); + this.repository = reactiveUserDetailsService; } @Override diff --git a/core/src/main/java/org/springframework/security/core/userdetails/MapUserDetailsRepository.java b/core/src/main/java/org/springframework/security/core/userdetails/MapReactiveUserDetailsService.java similarity index 78% rename from core/src/main/java/org/springframework/security/core/userdetails/MapUserDetailsRepository.java rename to core/src/main/java/org/springframework/security/core/userdetails/MapReactiveUserDetailsService.java index 1149996f74..309a7137c2 100644 --- a/core/src/main/java/org/springframework/security/core/userdetails/MapUserDetailsRepository.java +++ b/core/src/main/java/org/springframework/security/core/userdetails/MapReactiveUserDetailsService.java @@ -30,20 +30,20 @@ import reactor.core.publisher.Mono; * @author Rob Winch * @since 5.0 */ -public class MapUserDetailsRepository implements UserDetailsRepository { +public class MapReactiveUserDetailsService implements ReactiveUserDetailsService { private final Map users; - public MapUserDetailsRepository(Map users) { + public MapReactiveUserDetailsService(Map users) { this.users = users; } - public MapUserDetailsRepository(UserDetails... users) { + public MapReactiveUserDetailsService(UserDetails... users) { this(Arrays.asList(users)); } - public MapUserDetailsRepository(Collection users) { + public MapReactiveUserDetailsService(Collection users) { Assert.notEmpty(users, "users cannot be null or empty"); - this.users = users.stream().collect(Collectors.toMap( u -> getKey(u.getName()), Function.identity())); + this.users = users.stream().collect(Collectors.toConcurrentMap( u -> getKey(u.getName()), Function.identity())); } @Override diff --git a/core/src/main/java/org/springframework/security/core/userdetails/UserDetailsRepository.java b/core/src/main/java/org/springframework/security/core/userdetails/ReactiveUserDetailsService.java similarity index 94% rename from core/src/main/java/org/springframework/security/core/userdetails/UserDetailsRepository.java rename to core/src/main/java/org/springframework/security/core/userdetails/ReactiveUserDetailsService.java index 36dc7a9d58..a5df83b523 100644 --- a/core/src/main/java/org/springframework/security/core/userdetails/UserDetailsRepository.java +++ b/core/src/main/java/org/springframework/security/core/userdetails/ReactiveUserDetailsService.java @@ -20,7 +20,7 @@ import org.springframework.security.core.userdetails.UserDetails; import reactor.core.publisher.Mono; -public interface UserDetailsRepository { +public interface ReactiveUserDetailsService { Mono findByUsername(String username); } diff --git a/core/src/test/java/org/springframework/security/authentication/UserDetailsRepositoryAuthenticationManagerTests.java b/core/src/test/java/org/springframework/security/authentication/ReactiveUserDetailsServiceAuthenticationManagerTests.java similarity index 95% rename from core/src/test/java/org/springframework/security/authentication/UserDetailsRepositoryAuthenticationManagerTests.java rename to core/src/test/java/org/springframework/security/authentication/ReactiveUserDetailsServiceAuthenticationManagerTests.java index a9eed7c05d..80b36d3cac 100644 --- a/core/src/test/java/org/springframework/security/authentication/UserDetailsRepositoryAuthenticationManagerTests.java +++ b/core/src/test/java/org/springframework/security/authentication/ReactiveUserDetailsServiceAuthenticationManagerTests.java @@ -28,7 +28,7 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetailsRepository; +import org.springframework.security.core.userdetails.ReactiveUserDetailsService; import org.springframework.security.crypto.password.PasswordEncoder; import reactor.core.publisher.Mono; import reactor.test.StepVerifier; @@ -38,9 +38,8 @@ import reactor.test.StepVerifier; * @since 5.0 */ @RunWith(MockitoJUnitRunner.class) -public class UserDetailsRepositoryAuthenticationManagerTests { - @Mock - UserDetailsRepository repository; +public class ReactiveUserDetailsServiceAuthenticationManagerTests { + @Mock ReactiveUserDetailsService repository; @Mock PasswordEncoder passwordEncoder; UserDetailsRepositoryAuthenticationManager manager; @@ -56,7 +55,7 @@ public class UserDetailsRepositoryAuthenticationManagerTests { @Test(expected = IllegalArgumentException.class) public void constructorNullUserDetailsRepository() { - UserDetailsRepository udr = null; + ReactiveUserDetailsService udr = null; new UserDetailsRepositoryAuthenticationManager(udr); } diff --git a/core/src/test/java/org/springframework/security/core/userdetails/MapUserDetailsRepositoryTests.java b/core/src/test/java/org/springframework/security/core/userdetails/MapReactiveUserDetailsServiceTests.java similarity index 83% rename from core/src/test/java/org/springframework/security/core/userdetails/MapUserDetailsRepositoryTests.java rename to core/src/test/java/org/springframework/security/core/userdetails/MapReactiveUserDetailsServiceTests.java index f31e87ece6..5c8b701507 100644 --- a/core/src/test/java/org/springframework/security/core/userdetails/MapUserDetailsRepositoryTests.java +++ b/core/src/test/java/org/springframework/security/core/userdetails/MapReactiveUserDetailsServiceTests.java @@ -23,30 +23,27 @@ import java.util.Collection; import java.util.Collections; import org.junit.Test; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; import reactor.core.publisher.Mono; -public class MapUserDetailsRepositoryTests { +public class MapReactiveUserDetailsServiceTests { private static final UserDetails USER_DETAILS = User.withUsername("user") .password("password") .roles("USER") .build(); - private MapUserDetailsRepository users = new MapUserDetailsRepository(Arrays.asList(USER_DETAILS)); + private MapReactiveUserDetailsService users = new MapReactiveUserDetailsService(Arrays.asList(USER_DETAILS)); @Test(expected = IllegalArgumentException.class) public void constructorNullUsers() { Collection users = null; - new MapUserDetailsRepository(users); + new MapReactiveUserDetailsService(users); } @Test(expected = IllegalArgumentException.class) public void constructorEmptyUsers() { Collection users = Collections.emptyList(); - new MapUserDetailsRepository(users); + new MapReactiveUserDetailsService(users); } @Test diff --git a/samples/javaconfig/hellowebflux-method/src/main/java/sample/SecurityConfig.java b/samples/javaconfig/hellowebflux-method/src/main/java/sample/SecurityConfig.java index 93e9952e22..74cd87c2dd 100644 --- a/samples/javaconfig/hellowebflux-method/src/main/java/sample/SecurityConfig.java +++ b/samples/javaconfig/hellowebflux-method/src/main/java/sample/SecurityConfig.java @@ -18,16 +18,12 @@ package sample; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.method.configuration.EnableReactiveMethodSecurity; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; -import org.springframework.security.authorization.AuthorizationDecision; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.config.web.server.HttpSecurity; -import org.springframework.security.core.Authentication; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.web.server.SecurityWebFilterChain; -import org.springframework.security.web.server.authorization.AuthorizationContext; -import reactor.core.publisher.Mono; /** * @author Rob Winch @@ -48,10 +44,10 @@ public class SecurityConfig { } @Bean - public MapUserDetailsRepository userDetailsRepository() { + public MapReactiveUserDetailsService userDetailsRepository() { UserDetails rob = User.withUsername("rob").password("rob").roles("USER").build(); UserDetails admin = User.withUsername("admin").password("admin").roles("USER","ADMIN").build(); - return new MapUserDetailsRepository(rob, admin); + return new MapReactiveUserDetailsService(rob, admin); } } diff --git a/samples/javaconfig/hellowebflux/src/main/java/sample/HelloWebfluxSecurityConfig.java b/samples/javaconfig/hellowebflux/src/main/java/sample/HelloWebfluxSecurityConfig.java index 4d90b18c87..f2d45e3a7a 100644 --- a/samples/javaconfig/hellowebflux/src/main/java/sample/HelloWebfluxSecurityConfig.java +++ b/samples/javaconfig/hellowebflux/src/main/java/sample/HelloWebfluxSecurityConfig.java @@ -18,7 +18,7 @@ package sample; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; @@ -30,11 +30,11 @@ import org.springframework.security.core.userdetails.UserDetails; public class HelloWebfluxSecurityConfig { @Bean - public MapUserDetailsRepository userDetailsRepository() { + public MapReactiveUserDetailsService userDetailsRepository() { UserDetails user = User.withUsername("user") .password("user") .roles("USER") .build(); - return new MapUserDetailsRepository(user); + return new MapReactiveUserDetailsService(user); } } diff --git a/samples/javaconfig/hellowebfluxfn/src/main/java/sample/HelloWebfluxFnSecurityConfig.java b/samples/javaconfig/hellowebfluxfn/src/main/java/sample/HelloWebfluxFnSecurityConfig.java index c3ea6b0120..6cb8faabea 100644 --- a/samples/javaconfig/hellowebfluxfn/src/main/java/sample/HelloWebfluxFnSecurityConfig.java +++ b/samples/javaconfig/hellowebfluxfn/src/main/java/sample/HelloWebfluxFnSecurityConfig.java @@ -18,7 +18,7 @@ package sample; import org.springframework.context.annotation.Bean; import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; -import org.springframework.security.core.userdetails.MapUserDetailsRepository; +import org.springframework.security.core.userdetails.MapReactiveUserDetailsService; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; @@ -30,11 +30,11 @@ import org.springframework.security.core.userdetails.UserDetails; public class HelloWebfluxFnSecurityConfig { @Bean - public MapUserDetailsRepository userDetailsRepository() { + public MapReactiveUserDetailsService userDetailsRepository() { UserDetails user = User.withUsername("user") .password("user") .roles("USER") .build(); - return new MapUserDetailsRepository(user); + return new MapReactiveUserDetailsService(user); } }