SecurityContextPersistenceFilter和SecurityContextHolder的作用

SecurityContextHolder

SecurityContextHolderSpring Security 中最基本的组件,SecurityContextHolder是一个工具类,只提供一些静态方法。这个工具类的目的是用来保存应用程序中当前使用人的安全上下文。

SecurityContext securityContext = SecurityContextHolder.getContext();

默认情况下:

  • SecurityContextHolder使用了ThreadLocal机制来保存每个使用者的安全上下文。
  • 根据Servlet规范,一个Servlet request的处理不管经历了多少个Filter,自始至终都由同一个线程来完成。

这意味着,只要针对某个使用者的逻辑执行都是在同一个线程中进行,即使不在各个方法之间以参数的形式传递其安全上下文,各个方法也能通过SecurityContextHolder工具获取到该安全上下文。并且因为SecurityContextHolder使用了ThreadLocal机制来保存每个使用者的安全上下文,所以在一个请求处理的逻辑执行中都在同一个线程中进行,而请求对应的安全上下文就保存在SecurityContextHolder中。所以我们才可以通过SecurityContextHolder.getContext();每个请求自己独立的安全上下文。

需要注意的一点是,这里说的是一次请求,而非一次会话,而如何将请求的信息保存在session中就要看下面的SecurityContextPersistenceFilter的工作原理了。

SecurityContextHolder的其他工作模式

根据不同的web应用可以有不同的上下文保存和管理方式,而SecurityContextHolder一共提供了三种工作模式,而每一种工作模式就对应着一个一种上下文管理方式。

SecurityContextHolder有以下三种模式:

  • MODE_THREADLOCAL (缺省工作模式,也就是默认模式)
  • MODE_GLOBAL
  • MODE_INHERITABLETHREADLOCAL
MODE_GLOBAL

这个称之为全局模式,该模式下的JVM中所有的线程使用同一个安全上下文,所以所以请求的线程都是共用一个上下文,而不存在MODE_THREADLOCAL模式中的使用ThreadLocal机制来保存每个使用者的安全上下文。

MODE_INHERITABLETHREADLOCAL

根据名字可以猜测出这是一个继承MODE_THREADLOCAL的一种模式,在该模式下,用户可以自定义自己的线程创建,并且希望这些自定义的新建线程也能使用创建者的安全上下文。

SecurityContextPersistenceFilter

SecurityContextPersistenceFilter其实是spring security中filterchainproxy中的一个Filter,而跨请求安全上下文SecurityContext的保持,是通过SecurityContextPersistenceFilter来实现的,SecurityContextPersistenceFilter将安全上下文SecurityContext对象保存为当前用户HttpSession对象的一个属性。

SecurityContextPersistenceFilter除了负责安全上下文的持久化,在一些restful api的非持久化的请求场景中,SecurityContextPersistenceFilter还负责该安全上下文的销毁。

SecurityContextPersistenceFilter有两个主要任务:

  • 在请求到达时处理之前,从SecurityContextRepository中获取安全上下文信息填充到SecurityContextHolder;
  • 在请求处理结束后返回响应时,将SecurityContextHolder中的安全上下文信息保存回SecurityContextRepository,并清空SecurityContextHolder。

SecurityContextPersistenceFilter的工作过程

对于一些要求跨 request 请求保持的场景,我们都是通过session来保存一次request中的信息,当下次请求过来的时候,我们可以通过session获取之前请求中的信息。SecurityContextPersistenceFilter这个filter就是处理请求最后的保存操作。

具体来讲,操作如下:

  • 一个安全上下文在某个请求1处理过程中被创建并记录到SecurityContextHolder(准确来说是SecurityContextHolder中对应的ThreadLocal);
  • 请求1的处理结束时返回响应时,SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession(SecurityContextRepository负责安全上下文的持久);
  • 后续该用户会话中的另外一个请求2处理过程开始时,SecurityContextPersistenceFilter会将安全上下文从HttpSession恢复到SecurityContextHolder;
  • 请求2处理过程结束时,SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession;
  • 后续其他请求的处理过程会重复和上面请求2处理过程中一样的使用SecurityContextPersistenceFilter重置/恢复SecurityContext的动作。

在现实场景中,处理在一些restful api的非持久化的请求场景中,SecurityContextPersistenceFilter负责安全上下文的销毁,具体操作如下:

  • 一个安全上下文在某个请求1处理过程中被创建并记录到SecurityContextHolder
  • 请求1的处理结束时,SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文进行销毁

SecurityContextPersistenceFilter和SecurityContextHolder的作用相关推荐

  1. A092_SpringSecurity

    目录 一.认证与授权-新手上路 1.认证授权概述 1.1.什么是认证 1.2.什么是授权 1.3.什么是RBAC 2.基于session的认证授权 2.1.认证流程和认证检查 2.2.授权流程 3.基 ...

  2. Spring Security 5.x+OAuth2.0+OIDC1.0

    Spring Security+OAuth2.0+OIDC1.0 文章目录 Spring Security+OAuth2.0+OIDC1.0 前言 一.准备工作 1.Spring Security相关 ...

  3. SecurityContextHolder.getContext().getAuthentication()正常请求有时候获取authentioncation为空异常问题

    SecurityContextHolder.getContext().getAuthentication()正常请求有时候获取authentioncation为空异常问题 问题原因 基于微服务环境, ...

  4. 【第九篇】SpringSecurity核心过滤器-SecurityContextPersistenceFilter

    SpringSecurity核心过滤器-SecurityContextPersistenceFilter 一.SpringSecurity中的核心组件   在SpringSecurity中的jar分为 ...

  5. SecurityContextPersistenceFilter详解

    试想一下,如果我们不使用Spring Security,如果保存用户信息呢,大多数情况下会考虑使用Session对吧?在Spring Security中也是如此,用户在登录过一次之后,后续的访问便是通 ...

  6. Object的finalize()方法的作用是否与C++的析构函数作用相同

    Object的finalize()方法的作用是否与C++的析构函数作用相同 public class Finalization {private static Finalization finaliz ...

  7. 浅显易懂 Makefile 入门 (02)— 普通变量和自动变量定义、使用($@、$^、$< 作用)、变量覆盖 override、变量的来源 origin

    1. 变量的定义 Makefile 文件中定义变量的基本语法如下: 变量的名称=值列表 变量的名称可以由大小写字母.阿拉伯数字和下划线构成.等号左右的空白符没有明确的要求,因为在执行 make 的时候 ...

  8. 【B/S实践】解决:vs中修改样式表后不起作用的问题

    缓存,有好多,cpu和内存之间的三级缓存,浏览器内的缓存! 缓存是因为速率不对等,通过缓存来加速内容的显示! 今天我在敲牛腩的时候遇到一个问题,找了半小时,才发现是缓存导致的问题! 试着运行aspx文 ...

  9. 卷积神经网络之卷积计算、作用与思想 深度学习

    博客:blog.shinelee.me | 博客园 | CSDN 卷积运算与相关运算 在计算机视觉领域,卷积核.滤波器通常为较小尺寸的矩阵,比如3×33×3.从这个角度看,多层卷积是在进行逐层映射,整 ...

最新文章

  1. linux配置4g网络命令_Linux网络基本配置命令
  2. c语言中如何表示矩阵的乘法,c语言矩阵相乘
  3. 2019年最新10份开源Java精选资料
  4. 正则表达式匹配不包含特定字符串解决匹配溢出问题
  5. JSP页面图片路径为中文时乱码解决办法
  6. python flask与django的区别_真正搞明白Python中Django和Flask框架的区别
  7. 明白90/10的原理吗?
  8. nginx ---- 静态资源部署
  9. Windows 2003 + ISA 2006+单网卡×××配置(3)
  10. mysql 递归表的创建_Mysql创建递归型的存储过程_MySQL
  11. Mybatis根据经度、纬度查询距离最近一个位置(Mysql )
  12. 由于找不到vcruntime140_1.dll,无法继续执行代码
  13. Python自动化小米手环运动数据导出
  14. 腾讯云服务器8核16G18M配置测评
  15. 【矩阵论】2. 矩阵分解——SVD
  16. Latex中插入用origin绘画的两条坐标轴,双x轴或者双y轴拥有不同刻度的图片
  17. 通过开源工具XCA工具签发和管理可被浏览器信任的SSL证书
  18. 软件测试培训班靠谱吗?一般多少钱?
  19. 制作嵌入式Linux根文件系统
  20. linux操作系统基础复习

热门文章

  1. iOS开发之Quartz 2D绘图
  2. 《Ext详解与实践》节选:文件上传
  3. 一个三行两列右列固定左列自适应宽度的CSS
  4. 在一台服务器上搭建多个项目的SVN
  5. C#发送邮件的实现实例解析
  6. 如何用Python从数据库里面获取数据?4个步骤就能轻松实现
  7. 作为一名程序员,谁没跳过槽,“6”招让你“空降”大厂
  8. elk收集nginx日志
  9. mysql返回#1114 – The table ‘xxxx’is full解决方法
  10. linux php安装memcached扩展