java—是否存在请求后securitycontext无法从threadlocal清除的情况?

2cmtqfgy  于 2021-10-10  发布在  Java
关注(0)|答案(1)|浏览(224)

对于使用默认threadlocalsecuritycontextholderstrategy保存 Authentication 将对象放入 ThreadLocal 变量,当spring security无法清除 ThreadLocal 在请求完成之前?
securitycontextpersistencefilter执行以下操作:
荷载 Authentication (来自 HttpSession 通过httpsessionsecuritycontextrepository)到上下文( SecurityContextHolder ).
通过应用程序调用筛选器链以继续执行请求。 Authentication 被清除 SecurityContextHolder 因此,后续请求使用相同的 ThreadLocal 没有无效数据。
简言之,是否有任何情况下#3会因为应用程序问题、超时或其他原因而无法完成?如果是,应用程序应如何确保适当的 Authentication 当前请求的详细信息(例如,确保数据对当前请求/用户有效)?

falq053o

falq053o1#

既然您链接到了源代码,那么请看一下 SecurityContextPersistenceFilter :

...
try {
    SecurityContextHolder.setContext(contextBeforeChainExecution);

    chain.doFilter(holder.getRequest(), holder.getResponse());

}
finally {
    SecurityContext contextAfterChainExecution = SecurityContextHolder
            .getContext();
    // Crucial removal of SecurityContextHolder contents - do this before anything
    // else.
    SecurityContextHolder.clearContext();
    ...

如您所见,上下文是在 try 块,并在 finally 块,因此在请求处理完成后不可能仍然设置上下文。

相关问题