Skip to content

基于内存的用户认证

官方文档: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. 基于内存的用户认证流程

  1. 程序启动时:
  • 创建InMemoryUserDetailsManager对象
  • 创建User对象,封装用户名密码
  • 使用InMemoryUserDetailsManager将User存入内存
  1. 校验用户时:
  • SpringSecurity自动使用InMemoryUserDetailsManagerloadUserByUsername方法从内存中获取User对象
  • UsernamePasswordAuthenticationFilter过滤器中的attemptAuthentication方法中将用户输入的用户名密码和从内存中获取到的用户信息进行比较(DaoAuthenticationProvider#retrieveUser),进行用户认证DaoAuthenticationProvider#additionalAuthenticationChecks Alt text