基于内存的用户认证
基于内存的用户认证
1、配置案例
@Configuration
//@EnableWebSecurity //开启 SpringSecurity 自定义配置(在 SpringBoot 项目中可以省略)
public class WebSecurityConfig {
@Bean
public UserDetailsService userDetailsService() {
InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
manager.createUser(User.withDefaultPasswordEncoder().username("jin").password("jin").roles("jin").build());
return manager;
}
}
2、认证流程分析
UserDetailsService
分析
2.1、
UsernamePasswordAuthenticationFilter
2.2、当用户登录时,会调用org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#attemptAuthentication
方法

执行:
org.springframework.security.authentication.ProviderManager#authenticate

执行:
org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider#authenticate

执行:
org.springframework.security.authentication.dao.DaoAuthenticationProvider#retrieveUser

执行:
org.springframework.security.provisioning.InMemoryUserDetailsManager#loadUserByUsername

回到:org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider#authenticate

执行:org.springframework.security.authentication.dao.DaoAuthenticationProvider#additionalAuthenticationChecks
校验密码

返回 UsernamePasswordAuthenticationFilter
,并封装完成后的 Authentication
org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#attemptAuthentication

返回 AbstractAuthenticationProcessingFilter
过滤器
org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#doFilter(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse, jakarta.servlet.FilterChain)

完成 认证。

总结
- 程序启动时:
- 创建
InMemoryUserDetailsManager
对象 - 创建
User
对象,封装用户名密码 - 使用
InMemoryUserDetailsManager
将User存入内存
- 创建
- 校验用户时:
SpringSecurity
自动使用InMemoryUserDetailsManager
的loadUserByUsername
方法从内存中
获取User对象- 在
UsernamePasswordAuthenticationFilter
过滤器中的attemptAuthentication
方法中将用户输入的用户名密码和从内存中获取到的用户信息进行比较,进行用户认证