基于内存的用户认证
官方文档:Java自定义配置
1. 创建自定义配置
创建一个WebSecurityConfig文件:
java
@Configuration
@EnableWebSecurity//Spring项目中需要添加此注解,SpringBoot项目中不需要
public class WebSecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser( //此行设置断点可以查看创建的user对象
User
.withDefaultPasswordEncoder()
.username("demo") //自定义用户名
.password("demo") //自定义密码
.roles("USER") //自定义角色
.build()
);
return manager;
}
}
其中UserDetailsService用来管理用户信息,InMemoryUserDetailsManager是UserDetailsService的一个实现,用来管理基于内存的用户信息。另外在SpringBoot中不用加上@EnableWebSecurity注解,是因为在内部配置类中SpringBootWebSecurityConfiguration已经加上了@EnableWebSecurity注解。
2. 测试
使用用户名密码:demo/demo测试登录。
3. 基于内存的用户认证流程
- 程序启动时:
- 创建
InMemoryUserDetailsManager
对象 - 创建
User
对象,封装用户名密码 - 使用InMemoryUserDetailsManager
将User存入内存
- 校验用户时:
- SpringSecurity自动使用
InMemoryUserDetailsManager
的loadUserByUsername
方法从内存中
获取User对象 - 在
UsernamePasswordAuthenticationFilter
过滤器中的attemptAuthentication
方法中将用户输入的用户名密码和从内存中获取到的用户信息进行比较(DaoAuthenticationProvider#retrieveUser),进行用户认证DaoAuthenticationProvider#additionalAuthenticationChecks