(62条消息) SecurityContextHolder_Leon_Jinhai_Sun的博客-CSDN博客_securitycontextholder

目录

SecurityContextHolder介绍

SecurityContextPersistenceFilter的工作过程


SecurityContextHolder介绍

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

SecurityContext securityContext = SecurityContextHolder.getContext();

(62条消息) ThreadLocal_Fairy要carry的博客-CSDN博客

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

 

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

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


SecurityContextPersistenceFilter的工作过程

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

具体来讲,操作如下:

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

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

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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐