跳至主要內容

基于内存的用户认证

Jin大约 1 分钟

基于内存的用户认证

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、认证流程分析

2.1、UserDetailsService 分析

image-20241119182717711
image-20241119182717711

2.2、UsernamePasswordAuthenticationFilter

当用户登录时,会调用org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#attemptAuthentication 方法

image-20241119184002077
image-20241119184002077

执行:

org.springframework.security.authentication.ProviderManager#authenticate

image-20241119184112420
image-20241119184112420

执行:

org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider#authenticate

image-20241119184214996
image-20241119184214996

执行:

org.springframework.security.authentication.dao.DaoAuthenticationProvider#retrieveUser

image-20241119184322013
image-20241119184322013

执行:

org.springframework.security.provisioning.InMemoryUserDetailsManager#loadUserByUsername

image-20241119184423049
image-20241119184423049

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

image-20241119184507095
image-20241119184507095

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

校验密码

image-20241119184629278
image-20241119184629278

返回 UsernamePasswordAuthenticationFilter,并封装完成后的 Authentication

org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter#attemptAuthentication

image-20241119184759667
image-20241119184759667

返回 AbstractAuthenticationProcessingFilter 过滤器

org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter#doFilter(jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse, jakarta.servlet.FilterChain)

image-20241119185012827
image-20241119185012827

完成 认证。

image-20241119185130837
image-20241119185130837

总结

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