SpringSecurity之RememberMe功能的原理

本文详细介绍了如何使用SpringSecurity实现RememberMe功能,让用户在下次登录时无需输入用户名和密码。RememberMeService接口是核心,包括autoLogin、loginFail和loginSuccess三个方法。在认证成功后,通过RememberMeAuthenticationFilter创建Token,并根据 PersistentTokenBasedRememberMeServices 或 TokenBasedRememberMeServices 进行持久化存储,可以选择在内存或数据库中保存。免密登录时,RememberMeAuthenticationFilter会处理免密登录流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在大多数网站中,都会实现RememberMe这个功能,方便用户在下一次登录时直接登录,避免再次输入用户名以及密码去登录,下面,主要讲解如何使用Spring Security实现记住我这个功能以及深入源码探究它的原理。

首先,如下图所示为Spring Security实现RememberMe功能的原理图:
在这里插入图片描述

核心接口:RememberMeService

在这里插入图片描述
先来看看RememberMeService接口的3个方法

方法名执行时间描述
autoLogin收到请求时,由RememberMeAuthenticationFilter调用执行实现免密登录
loginFail认证失败时被执行清除remember-meCookie等
loginSuccess认证成功时被执行创建Token,持久化Token到内存或数据库

loginSuccess怎么生成的Token并保存到哪里去了?

SpringSecurity中的一个很重要的过滤器AbstractAuthenticationProcessingFilter,它是认证过程的入口也是出口。看一下源码:
在这里插入图片描述

剥开successfulAuthentication()方法看看:
在这里插入图片描述
在用户认证成功后,即要对remember-me功能的处理啦。
remberMeServies.loginSuccess()就是这一切的开端!!
看看这个service的实现类:
在这里插入图片描述

  • 这个NullRememberMeService很奇特,查看this.rememberMeService属性发现默认的实现类就是这个NullRememberMeService
    • 在这里插入图片描述
    • 但实际上这个实现类就和它的名字一样没有丝毫作用。
  • 重点在另一个AbstractRememberMeServices实现类中:
    • 在这里插入图片描述
    • 在这里插入图片描述
  • 出现了两个子类:
    • PersistentTokenBasedRememberMeServices
      • 实现持久化Token RememberMeService
    • TokenBasedRemeberMeService
      • 基础Token RememberMeService

PersistentTokenBasedRememberMeServices 持久化Token实现 RememberMe功能

在这里插入图片描述
在这里插入图片描述

又是两个实现类:

  • InMemoryTokenRepositoryImpl
    • 在内存中存储Token的实现类,内部维护了一个Map存储Token
    • 在这里插入图片描述
  • JdbcTokenRepositoryImpl
    • 在数据库中存储Token的实现类。内部已经存好了操作Token的CURD,使用JdbcTemplate进行操作数据库。tip:使用的时候一定会需要到数据源的设置
    • 在这里插入图片描述

这下两种Token的存储方式就已经裸露的出来,总结一下两种存储方式的特点:

  1. 基于数据库持久化Token,
  2. 在内存中使用Map维护了Token。
    在这里插入图片描述

autoLogin免密登录的过程

前面在认证成功后就会创建Token,只需要传入remember-me参数,就可以持久化Token。以便下一次的免密登录。
免密登录要从RememberMeAuthenticationFilter过滤器开始:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值