在一个ServletWeb应用中,对于一个请求进行处理的全过程,服务端使用的是同一个线程,通过利用SecurityContextHolder的MODE_THREADLOCAL安全上下文SecurityContext保持机制,无论该处理过程中使用到了哪些对象的哪些方法,这些方法内都可以获得当前访问者的安全上下文SecurityContext。但是,如果跨多个请求需要保持同样的安全上下文SecurityContext,又该怎么办呢?
这种需求很常见,同一个用户登录之后会对服务器发起多次请求,每次请求用到的安全上下文
SecurityContext都应该是一样的。
在Spring Security中,跨请求安全上下文SecurityContext的保持,是通过SecurityContextPersistenceFilter来实现的,缺省情况下,SecurityContextPersistenceFilter将安全上下文SecurityContext对象保存为当前用户HttpSession对象的一个属性,这样,当前用户在同一个会话的多个请求之间,就可以使用同一个安全上下文对象了。
具体来讲,可以理解为如下流程:
- 一个安全上下文在某个请求1处理过程中被创建并记录到
SecurityContextHolder; - 请求1的处理结束时,
SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession; - 后续该用户会话中的另外一个请求2处理过程开始时,
SecurityContextPersistenceFilter会将安全上下文从HttpSession恢复到SecurityContextHolder; - 请求2处理过程结束时,
SecurityContextPersistenceFilter会将SecurityContextHolder中的安全上下文保存到HttpSession; - 后续其他请求的处理过程会重复和上面请求2处理过程中一样的使用
SecurityContextPersistenceFilter重置/恢复SecurityContext的动作。
另外还有一些应用是不使用Session机制的,比如无状态的Restful API,这类接口需要每次认证。但是对于这种请求的处理过程,SecurityContextPersistenceFilter还是会被使用到,它被用来在每个请求处理结束时清除SecurityContextHolder中的安全上下文。

本文介绍Spring Security如何通过SecurityContextPersistenceFilter实现跨请求的安全上下文保持。在一个Servlet Web应用中,针对不同请求间的同一用户会话,Spring Security利用HttpSession保存安全上下文,确保各请求间的一致性。
997

被折叠的 条评论
为什么被折叠?



