栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringSecurity之RememberMe功能的原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringSecurity之RememberMe功能的原理

在大多数网站中,都会实现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过滤器开始:


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/332708.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号