正如我们在上一篇文章中所看到的,我们的spring应用程序的用户名和密码是通过环境变量配置的。 这对于原型目的是可以的,但是在现实生活中,我们必须提供另一种方式来使用户有资格登录到该应用程序。 为此,我们使用UserDetailsService接口。
用户详细信息服务带有loadUserByUsername函数。 loadUserByUsername根据用户名查找用户。 搜索结果(如果存在)然后使用通过UserDetailsService检索的用户信息来验证通过登录表单提供的凭据。
因此,让我们从一个非常简单的自定义用户详细信息服务开始。
@Service
public class UserDetailsServiceImpl implements UserDetailsService {@Overridepublic UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {if(username.equals("test")) {return User.withDefaultPasswordEncoder().username("test").password("test").roles("test").build();} else {return null;}}
}
如您所见,唯一能够登录的用户是使用用户名test的用户。 当涉及到用户详细信息时,spring也为我们提供了一个构建器。 作为密码编码器,我们指定了默认密码编码器,它实际上是一种编码器,因为我们提供了密码明文,所以它根本不进行密码哈希处理。
尽管密码编码器将在另一篇教程中介绍,但最好还是提醒您,出于安全原因, 应始终对存储在数据库中的密码进行哈希处理。
现在,您需要添加任何其他信息吗? 好吧 在您的Spring上下文中,仅具有一个实现UserDetailsService的bean就足够了。 Spring安全将选择您提供的UserDetailsService实现,并将其用于身份验证。
例如,您甚至可以使用@Bean配置来提供UserDetailsService。
@Configuration
public class SecurityConfig {@Beanpublic UserDetailsService createUserDetailsService() {return new UserDetailsServiceImpl();}}
通过这种方式,无论您的用户信息存储在sql数据库,nosql数据库还是csv文件中,您唯一要做的就是在loadUserByUsername中加载用户并通过创建一个UserDetails对象。
翻译自: https://www.javacodegeeks.com/2018/05/spring-security-with-spring-boot-2-0-userdetailsservice.html