SpringSecurity源码分析(RemeberMe)

RememberMeServices

RememberMeServices
记住我的服务的接口
可以重写实现自己的记住我

public interface RememberMeServices {
//建议 org. springframework. security. authentication. RememberMeAuthenticationToken 在大多数情况下使用它,因为它具有相应的身份验证提供程序。Authentication autoLogin(HttpServletRequest request, HttpServletResponse response);void loginFail(HttpServletRequest request, HttpServletResponse response);void loginSuccess(HttpServletRequest request, HttpServletResponse response,Authentication successfulAuthentication);
}

AbstractRememberMeServices
记住我基类

public abstract class AbstractRememberMeServicesimplements RememberMeServices, InitializingBean, LogoutHandler, MessageSourceAware {
}
  1. 从请求内获取cookie
  2. 判断cookie长度是否为0,为0删除cookie
  3. cookie解码
  4. 执行autoLoginCookie,返回用户详细信息
  5. 检查cookie判断是否被禁用
  6. 创建从 autoLogin 方法返回的最终 Authentication 对象。

在这里插入图片描述
在请求中找到 Spring Security 记住我 cookie 并返回其值。
在这里插入图片描述
在这里插入图片描述
当MaxAge为0时候表示删除cookie
在这里插入图片描述
解码 cookie 并使用 “:” 分隔符将其拆分为一组令牌字符串。
在这里插入图片描述
由子类实现,整个autoLogin是一个模板方法
在这里插入图片描述

在这里插入图片描述

返回的最终 Authentication 对象在这里插入图片描述

TokenBasedRememberMeServices
校验过期时间->生成签名并与cookieTokens中进行比较
在这里插入图片描述
在这里插入图片描述

PersistentTokenBasedRememberMeServices
默认实现InMemory,还提供了JDBC
在这里插入图片描述

RememberMeAuthenticationFilter

来看看RememberMe的引用
之前也提到过GenericFilterBean,他是Filte的简单基本实现,不处理这个过滤器仅执行一次

public class RememberMeAuthenticationFilter extends GenericFilterBean implements ApplicationEventPublisherAware {
// 成功处理器private AuthenticationSuccessHandler successHandler;
// 授权管理器private AuthenticationManager authenticationManager;
// 上文提到的记住我服务	private RememberMeServices rememberMeServices;
// 策略类private SecurityContextRepository securityContextRepository = new NullSecurityContextRepository();
}
private void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {// 不为null,说明已经认证过了if (SecurityContextHolder.getContext().getAuthentication() != null) {this.logger.debug(LogMessage.of(() -> "SecurityContextHolder not populated with remember-me token, as it already contained: '"+ SecurityContextHolder.getContext().getAuthentication() + "'"));chain.doFilter(request, response);return;}Authentication rememberMeAuth = this.rememberMeServices.autoLogin(request, response);if (rememberMeAuth != null) {// Attempt authenticaton via AuthenticationManagertry {// 授权、认证rememberMeAuth = this.authenticationManager.authenticate(rememberMeAuth);// Store to SecurityContextHolder// 重新设置上下文SecurityContext context = SecurityContextHolder.createEmptyContext();context.setAuthentication(rememberMeAuth);// 之前也提及过,默认是threadLoacl	SecurityContextHolder.setContext(context);	onSuccessfulAuthentication(request, response, rememberMeAuth);this.logger.debug(LogMessage.of(() -> "SecurityContextHolder populated with remember-me token: '"+ SecurityContextHolder.getContext().getAuthentication() + "'"));// 保存securityContextthis.securityContextRepository.saveContext(context, request, response);if (this.eventPublisher != null) {this.eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(SecurityContextHolder.getContext().getAuthentication(), this.getClass()));}if (this.successHandler != null) {this.successHandler.onAuthenticationSuccess(request, response, rememberMeAuth);return;}}catch (AuthenticationException ex) {this.logger.debug(LogMessage.format("SecurityContextHolder not populated with remember-me token, as AuthenticationManager "+ "rejected Authentication returned by RememberMeServices: '%s'; "+ "invalidating remember-me token", rememberMeAuth),ex);this.rememberMeServices.loginFail(request, response);onUnsuccessfulAuthentication(request, response, ex);}}chain.doFilter(request, response);}

RememberMeAuthenticationToken

在这里插入图片描述
指示类可以处理特定的 Authentication 实现,策略模式

public interface AuthenticationProvider {
Authentication authenticate(Authentication authentication) throws AuthenticationException;
boolean supports(Class<?> authentication);
}

RememberMeAuthenticationProvider
在这里插入图片描述

RememberMeConfigurer

配置记住我过滤器,核心方法init和configure

在这里插入图片描述
这一步可以设置自己的RememberMeService
在这里插入图片描述

 .and().rememberMe().rememberMeServices(rememberMeServices()) // 设置自动登录时使用rememberServic

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834262.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++初识及概述

C概述 c简介 “ c ”中的来自于c语言中的递增运算符&#xff0c;该运算符将变量加1。c起初也叫 ” c with clsss ”.通过名称表明&#xff0c;c是对C的扩展&#xff0c;因此c是c语言的超集&#xff0c;这意味着任何有效的c程序都是有效的c程序。c程序可以使用已有的c程序库。…

词袋法TFIDF

Tf-idf⽂本特征提取 TF-IDF的主要思想是&#xff1a;如果某个词或短语在⼀篇⽂章中出现的概率⾼&#xff0c;并且在其他⽂章中很少出现&#xff0c;则认为此词或者短语具有很好的类别区分能⼒&#xff0c;适合⽤来分类。TF-IDF作⽤&#xff1a;⽤以评估⼀字词对于⼀个⽂件集或…

OpenAI 发布 AI 生成图片检测器;Meta 推出 AI 广告创意工具;Google 正式发布 Pixel 8a,主打 AI

OpenAI 发布 AI 生成图片检测器 OpenAI 昨日官宣推出专用的 AI 监测工具&#xff0c;用于监测图片是否由其旗下 AI 图片生成工具 DALL-E 生成&#xff0c;准确率高达 98.8%。 不过该公司表示&#xff0c;这个检测工具并非旨在检测 Midjourney 和 Stability 等其他流行生成器生…

安卓使用Fiddler抓包 2024

简介 最近试了一下安卓使用fiddler 抓包&#xff0c;发现https包基本都会丢失。原因是Anandroid 7版本针对ssl安全性做了加强&#xff0c;不认可用户的证书。我们要做的就是把fiddler导出的证书进过处理后放置到系统证书目录下面&#xff0c;这样才能抓包https请求。 这里使用…

https介绍,加密解密(举例+必要性,对称/非对称加密介绍),数字摘要/指纹(介绍,应用(session id,网盘的秒传功能))

目录 https 引入 介绍 加密解密层 介绍 没有绝对的安全 使用ssl的弊端 加密解密 概念 加密 解密 秘钥 举例 现实中 网络中 加密的必要性 常见加密方式 对称加密 特点 非对称加密 特点 数字摘要/指纹 介绍 应用 session id 百度网盘的秒传功能 https …

21_Scala集合_可变数组ArrayBuffer

文章目录 ArrayBuffer1.创建可变数组ArrayBuffer2.增加数据3.删除数据4.修改数据5.查询数据Appendix ArrayBuffer ArrayBuffer可变数组–感觉优点类似于Java的ArrayList 1.创建可变数组ArrayBuffer –请注意下面的mutable import scala.collection.mutable.ArrayBuffer //m…

DuDuTalk:4G桌面拾音设备在银行网点服务场景的应用价值

随着科技的飞速发展&#xff0c;银行业也在不断地寻求创新以提高服务质量和效率。在这个过程中&#xff0c;4G桌面拾音设备作为一种新型的智能设备&#xff0c;其在银行网点服务场景中的应用价值逐渐凸显出来。本文将从多个角度探讨4G桌面拾音设备在银行网点服务场景的应用价值…

英语学习笔记6——What make is it?

What make is it? 它是什么牌子的&#xff1f; make n.&#xff08;产品的&#xff09;品牌名称    v. 制作 区别&#xff1a;model n.&#xff08;产品的&#xff09;型号       n. 模型       n. 模特 make 指的是大的品牌名称&#xff0c; model 是旗下产品…

MapReduce原理

MapReduce 的实际处理过程可以分解为 Input、Map、Sort(排序)、Combine(局部合并)、Partition(分区)、Reduce(全局聚合)、Output 等阶段。 1 MapReduce的作用 化大为小、分而治之2 Map和Reduce阶段的作用 Map阶段: 把输入变成(Key,Value)结果,用于reduce阶段的输入.(结果局…

专业习惯:拥有好习惯,让自己少走弯路

小细节决定成败&#xff0c;小习惯决定未来。也许读者对于做IT产品缺乏深度与广度的应用认知&#xff0c;不能完全理解&#xff0c;这没有关系。跟着博主的节奏来&#xff0c;随着理论结合实践的深入学习&#xff0c;你会越来越明白的。 俗话说&#xff0c;”有志不在年高&…

Js地图路线规划以及点击获取经纬度

废话不多说&#xff0c;直接上代码。 代码script引用链接链接来自高德地图开放平台。&#xff08;高德开放平台 | 高德地图API (amap.com)&#xff09; <!doctype html> <html><head><meta charset"utf-8"><meta http-equiv"X-UA-…

OpenHarmony 实战开发——南向统一编译的docker镜像来了

由于我自己的南向设备开发平台的需求&#xff0c;我将当前几个不同的 docker 镜像版本进行了整合&#xff0c;经过一段时间的攻关和验证&#xff0c;目前整合已完成&#xff0c;新版本的 Dockerfile 如下&#xff0c;这个不是公共需求&#xff0c;所以没有提交主干&#xff0c;…

std::lock_guard和std::unique_lock的差别

std::lock_guard 和 std::unique_lock 都是 C 标准库 <mutex> 中提供的用于管理互斥体&#xff08;mutex&#xff09;的 RAII&#xff08;Resource Acquisition Is Initialization&#xff09;风格的类。它们的主要目标都是确保互斥体在适当的时候被锁定和解锁&#xff0…

Web APIs 学习归纳8---移动端特效

上一节学习了PC端的特效&#xff0c;现在学习移动端的特效。 一、移动端触屏事件 1.1 触屏事件概述 移动端浏览器兼容性较好&#xff0c;我们不需要考虑以前 JS 的兼容性问题&#xff0c;可以放心的使用原生 JS 书写效果&#xff0c;但是移动 端也有自己独特的地方。比如触屏…

Go语言函数

在Go语言中&#xff0c;函数是一种基本的构建块&#xff0c;用于组织代码并执行特定任务。它们是可重复使用的代码段&#xff0c;可以接收输入参数&#xff0c;执行一系列操作&#xff0c;并可返回结果。以下是Go语言中函数的详细介绍及其使用方法&#xff1a; 基本语法 Go语…

让新手变中手的ChatGPT 使用方法

让新手变中手的ChatGPT 使用方法 已经要一年了,没想到这篇还是一样有用。看到许多依然是一句话就要问出结果的教学,就知道AI 进步很快,但人的学习速度还需要更多时间。 以下为去年原版内容加上新的两招更新,希望帮助你使用ChatGPT 更好用,当未来文字可直接生成影像时,你…

容联云孔淼:大模型落地与全域营销中台建设

近日&#xff0c;由金科创新社主办的2024区域性商业银行数智化转型研讨会顺利召开&#xff0c; 容联云产业数字云事业群副总经理、诸葛智能创始人孔淼受邀出席&#xff0c;并分享数智化转型实践经验。 他分享了容联云两大核心产品&#xff0c;“大模型应用容犀Copilot”在金融营…

TypeScript 基础学习笔记:interface 与 type 的异同

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 TypeScript 学习笔记&#xff1a;interface 与 type 的异同&#x1f3a3; 引言&#x1f680; 快速入门1️⃣ Interface&#xff08;接口&#xff09;&#x1f4cb; 定义&#x1f91d; 实现&#x1f4a1; 特点 2️⃣ Type Al…

Android 高版本实现沉浸式状态栏

目前实现的android高版本沉浸式状态栏分为两类&#xff1a; 1、是纯透明状态栏&#xff1b; 2、是纯透明状态栏&#xff0c;但是状态栏字体是黑色&#xff1b; 将状态栏的代码封装到BaseActivity中更方便使用&#xff1a; BaseActivity: public abstract class BaseActivit…

如何在Linux中安装Docker Compose

下载安装 在Linux中安装Docker Compose相对简单&#xff0c;你可以按照以下步骤进行 确保Docker已经安装   Docker Compose需要在系统上安装了Docker才能正常工作。如果你的系统上还没有安装Docker&#xff0c;请先安装Docker。 下载Docker Compose   你可以从Docker官方Gi…