当前位置: 首页 > news >正文

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08

这个功能大家还熟悉么?我们在登录网站的时候,除了让你输入用户名和密码,还会有个勾选框:
记住我!!!不是让大家记住我哈。

在这里插入图片描述

值得一提的是,Spring Security 也提供了这个功能,我们今天就来体验一把。

代码实战

其实想要开启rememberMe功能,其实很简单,只需要简单的修改下配置即可:

    @Beanpublic SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests().anyRequest().authenticated().and().formLogin().permitAll().and().rememberMe().and().csrf().disable();return http.build();}

实现思路

  • 当用户登录网站后,并且勾选rememberMe
  • 服务端认证通过,则把用户信息进行算法加密,加密完成后,通过cookie,让浏览器把cookie保存在本地
  • 当浏览器关闭后重新打开网站,浏览器会把cookie带给服务端
  • 服务端校验cookie确定用户身份,进而自动登录

源码分析

首先我们找切入点,我们前面讲过当引入一个新功能的时候,必定会引入一个configurer,rememberMe 也不例外:点击.rememberMe()进入源码
在这里插入图片描述

看到了RememberMeConfigurer,我们点进去看下主要是看init和configure方法

init

	public void init(H http) throws Exception {validateInput();String key = getKey();RememberMeServices rememberMeServices = getRememberMeServices(http, key);http.setSharedObject(RememberMeServices.class, rememberMeServices);LogoutConfigurer<H> logoutConfigurer = http.getConfigurer(LogoutConfigurer.class);if (logoutConfigurer != null && this.logoutHandler != null) {logoutConfigurer.addLogoutHandler(this.logoutHandler);}RememberMeAuthenticationProvider authenticationProvider = new RememberMeAuthenticationProvider(key);authenticationProvider = postProcess(authenticationProvider);http.authenticationProvider(authenticationProvider);initDefaultLoginFilter(http);}
  • getKey() 这个就是我们刚开始设置的key,如果不配置,每次系统都会重启,导致需要重新登录
  • getRememberMeServices() 用来实现自动登录、处理登录成功和登录失败的逻辑,主要有两个继承
    • PersistentTokenBasedRememberMeServices 持久化令牌到数据库
    • TokenBasedRememberMeServices
  • http.authenticationProvider(authenticationProvider);创建一个认证器放到providerList里面
  • initDefaultLoginFilter(http); 在自定生成登录页面加上rememberMe 选框

configure

	public void configure(H http) {RememberMeAuthenticationFilter rememberMeFilter = new RememberMeAuthenticationFilter(http.getSharedObject(AuthenticationManager.class), this.rememberMeServices);if (this.authenticationSuccessHandler != null) {rememberMeFilter.setAuthenticationSuccessHandler(this.authenticationSuccessHandler);}rememberMeFilter = postProcess(rememberMeFilter);http.addFilter(rememberMeFilter);}
  • 创建了一个过滤器:RememberMeAuthenticationFilter
  • postProcess(rememberMeFilter); 注入IOC容器
  • 在http中加入rememberMe过滤器

看完了RememberMeConfigurer的两个核心方法之后,我们现在知道容器中已经有了RememberMeAuthenticationFilter和RememberMeAuthenticationProvider
现在分别来看下

RememberMeAuthenticationFilter

private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {Authentication rememberMeAuth = this.rememberMeServices.autoLogin(request, response);if (rememberMeAuth != null) {// Attempt authenticaton via AuthenticationManagertry {rememberMeAuth = this.authenticationManager.authenticate(rememberMeAuth);// Store to SecurityContextHolderSecurityContext context = SecurityContextHolder.createEmptyContext();context.setAuthentication(rememberMeAuth);SecurityContextHolder.setContext(context);onSuccessfulAuthentication(request, response, rememberMeAuth);this.securityContextRepository.saveContext(context, request, response);if (this.successHandler != null) {this.successHandler.onAuthenticationSuccess(request, response, rememberMeAuth);return;}}catch (AuthenticationException ex) {this.rememberMeServices.loginFail(request, response);onUnsuccessfulAuthentication(request, response, ex);}}chain.doFilter(request, response);}
  • 调用autoLogin方法
    • 从cookie提取用户身份,在调用loadUserByUsername获取用户详细信息
    • 校验用户身份是否合法(根据不同的令牌存储方式进行不同校验)
    • 如果校验通过,则返回Authentication(RememberMeAuthenticationToken)
  • authenticate
    • 如果autoLogin成功,则和前面普通登录一样进行认证
    • 因为这里生成的是RememberMeAuthenticationToken,则最终会被RememberMeAuthenticationProvider处理
  • 如果认证返回则进行对应的响应处理

RememberMeAuthenticationProvider

	public Authentication authenticate(Authentication authentication) throws AuthenticationException {if (!supports(authentication.getClass())) {return null;}if (this.key.hashCode() != ((RememberMeAuthenticationToken) authentication).getKeyHash()) {throw new BadCredentialsException(this.messages.getMessage("RememberMeAuthenticationProvider.incorrectKey","The presented RememberMeAuthenticationToken does not contain the expected key"));}return authentication;}

这里的逻辑只做了一步,校验key的hashCode是否一致,如果一致,则校验通过

相关文章:

SpringSecurity5|12.实现RememberMe 及 实现原理分析

security/day08 这个功能大家还熟悉么&#xff1f;我们在登录网站的时候&#xff0c;除了让你输入用户名和密码&#xff0c;还会有个勾选框&#xff1a; 记住我&#xff01;&#xff01;&#xff01;不是让大家记住我哈。 值得一提的是&#xff0c;Spring Security 也提供了这个…...

持续集成交付CICD:Jenkins Sharedlibrary 共享库

目录 一、理论 1.共享库 2.共享库配置 3.使用共享库 4.共享库扩展 二、实验 1.连接共享库 2.使用共享库 三、问题 1.路径报错 2.readJSON 报错 一、理论 1.共享库 &#xff08;1&#xff09;概念 1&#xff09;共享库这并不是一个全新的概念&#xff0c;其实在编…...

Linux--网络编程

一、网络编程概述1.进程间通信&#xff1a; 1&#xff09;进程间通信的方式有**&#xff1a;管道&#xff0c;消息队列&#xff0c;共享内存&#xff0c;信号&#xff0c;信号量这么集中 2&#xff09;特点&#xff1a;依赖于linux内核&#xff0c;基本是通过内核来实现应用层…...

数据结构 并查集

作用 快速的处理以下问题&#xff1a;【近乎O(1)的时间完成】 1.将两个集合合并 2.询问两个元素是否在一个集合中 用树的形式维护集合 基本原理 每一个集合用一棵树表示 每一个集合的编号就是根结点的编号&#xff0c;对于每一个结点&#xff0c;都存储其父结点&#xf…...

算法通关村第十六关黄金挑战——求滑动窗口中的最大值(滑动窗口与堆方法、双端队列法和直接比较法)

大家好&#xff0c;我是怒码少年小码。 今天这篇就讲一道题目&#xff0c;不难&#x1f60e;&#xff0c;但是一定要学会自己思考。 滑动窗口最大值 LeetCode 239&#xff1a;给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。…...

常见树种(贵州省):009楠木、樟木、桂木种类

摘要&#xff1a;本专栏树种介绍图片来源于PPBC中国植物图像库&#xff08;下附网址&#xff09;&#xff0c;本文整理仅做交流学习使用&#xff0c;同时便于查找&#xff0c;如有侵权请联系删除。 图片网址&#xff1a;PPBC中国植物图像库——最大的植物分类图片库 一、楠木 …...

全志H616开发版

开发板介绍&#xff1a; 二、开发板刷机 SDFormatter TF卡的格式化工具、Win32Diskimager 刷机工具 刷机镜像为&#xff1a;Orangepizero2_2.2.0_ubuntu_bionic_desktop_linux4.9.170.img 使用MobaXterm_Personal_20.3连接使用 网络配置&#xff1a;nmcli dev wifi 命令接入网…...

【Spring boot】RedisTemplate中String、Hash、List设置过期时间

文章目录 前言Redis中String设置时间的方法Redis中Hash和List设置时间的方法Redis中Hash的put、putAll、putIfAbsent区别 前言 时间类型&#xff1a;TimeUnit import java.util.concurrent.TimeUnit;TimeUnit.SECONDS:秒 TimeUnit.MINUTES&#xff1a;分 TimeUnit.HOURS&…...

Nosql之redis概述及基本操作

关系数据库与非关系型数据库概述 关系型数据库 关系型数据库是一个结构化的数据库&#xff0c;创建在关系模型&#xff08;二维表格模型&#xff09;基础上&#xff0c;一般面向于记录。SQL语句(标准数据查询语言)就是一种基于关系型数据库的语言&#xff0c;用于执行对关系型…...

使ros1和ros2的bag一直互通

很多文章都是先source ros1 然后source ros2,再play bag source /opt/ros/noetic/setup.bash source /opt/ros/foxy/setup.bash ros2 bag play -s rosbag_v2 kitti_raw00.bag 但实测会出问题: 为使ros1和ros2的bag一直互通 sudo apt update sudo apt install ros-foxy-ro…...

【正点原子 linux 驱动编程】

在此声明&#xff0c;正用点编的说明书真的拉&#xff0c;丝毫不具备兼容性。。比如linux的第一个实验&#xff0c;其中包含的 unregister_chrdev_region 函数&#xff0c;fileoperation 结构体等均来自 <linux/fs.h> 文件&#xff0c;搞不懂&#xff0c;他们方ide.h&…...

使用Python的turtle模块绘制玫瑰花图案(含详细Python代码与注释)

1.1引言 turtle模块是Python的标准库之一&#xff0c;它提供了一个绘图板&#xff0c;让我们可以在屏幕上绘制各种图形。通过使用turtle&#xff0c;我们可以创建花朵、叶子、复杂的图案等等。本博客将介绍如何使用turtle模块实现绘制图形的过程&#xff0c;并展示最终结果。 …...

Redis学习笔记14:基于spring data redis及lua脚本ZSET有序集合实现环形结构案例及lua脚本如何发送到redis服务器

案例实现目标&#xff0c;一、实现一个环形结构&#xff0c;环形结构上节点有一个阀值threshold,超过阀值则移除分数score最低的成员&#xff0c;不足则将当前成员添加进环中&#xff0c;且确保成员不可重复&#xff1b;二、每次访问环中的数据都需要刷新key的过期时间&#xf…...

openssl C++研发之pem格式处理详解

一、PEM_writeXXX和EM_write_bio_XXX 在OpenSSL的crypto/pem.h头文件中&#xff0c;PEM_write_XXXX和PEM_write_bio_XXXX系列函数用于将特定类型的数据写入文件或BIO&#xff08;内存缓冲区&#xff09;中&#xff0c;其中XXXX代表不同的数据类型。 这些函数的使用方式相似&a…...

【教3妹学编辑-mysql】详解数据库三大范式

什么是范式 简单地理解就是&#xff1a;数据库设计时遵循的规范 三大范式 数据库三大范式包含&#xff1a;1、第一范式(1NF)&#xff1b;2、第二范式(2NF)&#xff1b;3、第三范式(3NF)。其中&#xff0c;第一范式(1NF)的要求是属性不可分割&#xff0c;第二范式(2NF)的要求是…...

【计算机网络笔记】路由算法之链路状态路由算法

系列文章目录 什么是计算机网络&#xff1f; 什么是网络协议&#xff1f; 计算机网络的结构 数据交换之电路交换 数据交换之报文交换和分组交换 分组交换 vs 电路交换 计算机网络性能&#xff08;1&#xff09;——速率、带宽、延迟 计算机网络性能&#xff08;2&#xff09;…...

读像火箭科学家一样思考笔记04_第一性原理(下)

1. 来自无形规则的阻力 1.1. 无形规则 1.1.1. 僵化成规则的不必要习惯和行为 1.1.2. 不像有形的书面规则 1.1.2.1. 书面规则出现在标准操作流程中&#xff0c;可以修改或删除 1.1.3. 成文的规则可能会抗拒变革&#xff0c;但无形规则却更加顽固 1.1.4. 我们为强加在自己身…...

开源集群管理系统对比分析:Kubernetes 与 Apache Mesos

集群管理系统是关键的软件解决方案&#xff0c;可以在互连机器网络中有效分配和利用计算资源。毫无疑问&#xff0c;它们通过确保可扩展性、高可用性和有效的资源管理在现代计算中发挥着至关重要的作用&#xff0c;这使得它们对于运行复杂的应用程序、管理数据中心以及进一步增…...

matlab 坡度滤波算法地面分割

目录 一、算法原理1、实现流程2、参考文献二、代码实现三、结果展示四、测试数据一、算法原理 1、实现流程 1、格网示意图 2、计算格网行列数 公式中的特殊符号为向上取整,...

【腾讯云 HAI域探秘】高性能服务器引领AI革新浪潮:从AI绘画、知识问答到PyTorch图像分类、视频检测的全方位探索

目录 1 HAI&#xff08;高性能应用服务&#xff09;简介2 HAI的应用场景2.1 HAI在AI作画中的灵活性与效率2.2 深入探索LLM语言模型的应用与性能2.3 HAI支持的AI模型开发环境与工具 3 基于stable difussio的AI 绘画应用实践3.1 使用AI模型中的stable diffusion模型服务3.2 设置和…...

cvx小白入门

一、cvx是什么&#xff1f; 是一个解决优化问题的Matlab工具箱&#xff0c;通常用于解决凸优化问题&#xff0c;提供了一种简洁的方式来定义和求解优化模型。 二、cvx怎么安装&#xff1f; 我是首先安装的cvx&#xff0c;在官网下载cvx-w64.zip包&#xff0c;然后解压缩。我…...

ClosureTree 在企业级应用中的最佳实践:高效构建 ActiveRecord 层级模型

ClosureTree 在企业级应用中的最佳实践&#xff1a;高效构建 ActiveRecord 层级模型 【免费下载链接】closure_tree Easily and efficiently make your ActiveRecord models support hierarchies 项目地址: https://gitcode.com/gh_mirrors/cl/closure_tree ClosureTree…...

安全代码沙盒实践:从Docker到seccomp的多层防御架构

1. 项目概述&#xff1a;安全代码执行的沙盒化实践在开发、测试乃至在线教育、代码评测平台等场景中&#xff0c;我们经常面临一个核心挑战&#xff1a;如何安全地执行一段来源未知、意图不明的代码&#xff1f;直接在生产服务器上运行用户提交的代码&#xff0c;无异于敞开大门…...

RPC的了解

文章目录1. RPC的概述2. RPC的核心工作原理3. RPC与 HTTP 的区别4. RPC 框架的核心功能5. 常见的RPC框架对比6. 什么时候考虑引入RPC7. 选型8. Dubbo1&#xff09;概述2. Dubbo核心功能3. Dubbo 具体使用1. RPC的概述 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程…...

2025注安备考资料全套|视频+讲义+前导课,直接拿来就能学

大家好&#xff0c;最近很多备考注册安全工程师的同学都在找系统、完整的备考资料&#xff0c;要么是课程零散不全&#xff0c;要么是讲义和视频不配套&#xff0c;复习起来特别费劲。为了帮大家省去整理资料的时间&#xff0c;我把自己整理的2024-2025注安全套备考资料分享出来…...

基于GPT的AI代码审查:GitHub Action自动化部署与实战指南

1. 项目概述&#xff1a;当AI成为你的代码审查搭档 在团队协作开发中&#xff0c;代码审查&#xff08;Code Review&#xff09;是保证代码质量、统一编码风格、传播知识的关键环节。但现实往往是&#xff0c;资深同事忙得脚不沾地&#xff0c;新人的PR&#xff08;Pull Reque…...

Python自动化构建个人抖音技能库:合规爬虫与内容管理实践

1. 项目概述&#xff1a;从零到一构建个人抖音自动化技能库 最近在折腾一个挺有意思的小项目&#xff0c;我给它起了个名字叫“my-copaw-skill”。这名字听着有点怪&#xff0c;其实“copaw”是我家猫的名字&#xff0c;整个项目说白了&#xff0c;就是把我日常刷抖音、研究抖音…...

告别乱码困扰:GBKtoUTF-8编码转换工具全方位指南

告别乱码困扰&#xff1a;GBKtoUTF-8编码转换工具全方位指南 【免费下载链接】GBKtoUTF-8 To transcode text files from GBK to UTF-8 项目地址: https://gitcode.com/gh_mirrors/gb/GBKtoUTF-8 你是否曾遇到过这样的场景&#xff1f;从旧系统导出的文档在Mac上打开变成…...

为什么顶尖AI产品团队正秘密重构设计系统?——AI原生用户体验的4层认知断层与SITS 2026破局公式

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;AI原生用户体验设计&#xff1a;SITS 2026交互设计新趋势 AI原生体验不再将模型能力“封装后隐藏”&#xff0c;而是让智能成为界面的第一公民——用户在输入框中键入自然语言时&#xff0c;系统实时推…...

流式深度强化学习突破“流式壁垒”:“意图更新”算法性能比肩SAC,计算量仅1/140

一脚油门&#xff0c;开出了多大的坑传统梯度学习的步长规定参数每次移动多大&#xff0c;但对函数输出改变多少缺乏控制。就像驾车学习停车入库&#xff0c;教练规定每次「踩油门0.1秒」&#xff0c;但不同路况下车子前进距离差异大&#xff0c;有时差一厘米入库&#xff0c;有…...