Spring Security RememberMe 记住密码自动登录过程源码分析

本文深入分析了Spring Security的RememberMe功能,从登录成功后的判断到持久化token,再到数据库与cookie的交互,以及后续的自动登录流程。通过源码解读,详细阐述了每个步骤如何确保安全性和有效性。
摘要由CSDN通过智能技术生成

目录

 环境Spring Boot 2.6.3

1. 登录成功后判断是否开启记住密码

  2. 创建持久化token,(记住密码功能的凭证) 

 3. 将凭证写入数据库并写入cookie返回

​  4. 下次登录时,请求经过filter,利用cookie中的token执行自动登录

 5. 通过比较cookie中的数据是否和数据库中持久化的数据一致

  6. 数据合法,产生Authentication对象

 7. 将authentication交给provider去认证


 环境Spring Boot 2.6.3

本文主要讲源码,具体实现代码就不粘全了
自定义UserDetailsService +自定义认证持久层(mysql数据库认证源)

WebSecurityConfigurerAdapter
            @Autowired
            DataSource dataSource;//我用的druid数据源

            @Autowired
            UserDetailsService userService;//自定义的实现了接口的类(没粘出来)
            
            @Bean
            public PersistentTokenRepository persistentTokenRepository(){
                JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
                tokenRepository.setDataSource(dataSource);//设置数据源
                return tokenRepository;
            }

           @Override
            protected void configure(HttpSecurity http) throws Exception {

               http.
                    ...
                                            //记住密码
                        .and().rememberMe()
//                      .rememberMeParameter("remember-me")//设置前端 表单记住密码的name
                        .tokenRepository(persistentTokenRepository())//设置持久层
                        .tokenValiditySeconds(60*60*24*7)//设置token有效期
                        // 设置  userDetailsService , 和 认证过程的同样,RememberMe 有专门的 RememberMeAuthenticationProvider ,也就意味着须要 使用UserDetailsService 加载 UserDetails 信息
                        .userDetailsService(userService)
            }

 Mysql(因为JdbcTokenRepositoryImpl 底层是把token保存在数据库所以要先建表)

create table persistent_logins (username varchar(64) not null, series varchar(64) primary key,token varchar(64) not null, last_used timestamp not null)

1. 登录成功后判断是否开启记住密码

UsernamePasswordAuthenticationFilter->
doFilter()->
        attemptAuthentication(request, response);//登录验证
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值