我正在阅读Spring Security文档,其中说SecurityContextHolder为具有特定线程行为的应用程序提供了不同类型的策略。例如-Swing应用程序。
我了解在网络应用中,我们可以使用ThredLocal策略。但是什么时候使用其他两种策略以及它们如何工作我无法理解。
最佳答案
参见Spring Security Reference:
SecurityContextHolder,SecurityContext和身份验证对象
最基本的对象是SecurityContextHolder
。我们在这里存储应用程序当前安全上下文的详细信息,其中包括当前使用该应用程序的主体的详细信息。默认情况下,SecurityContextHolder
使用ThreadLocal
存储这些详细信息,这意味着安全上下文始终可用于同一执行线程中的方法,即使没有将安全上下文作为这些方法的参数显式传递。如果在处理了当前委托人的请求后要清除线程,则以这种方式使用ThreadLocal
是非常安全的。当然,Spring Security会自动为您解决此问题,因此无需担心。
某些应用程序不完全适合使用ThreadLocal
,因为它们使用线程的特定方式。例如,Swing客户端可能希望Java虚拟机中的所有线程都使用相同的安全上下文。可以为SecurityContextHolder
配置启动策略,以指定希望如何存储上下文。对于独立应用程序,应使用SecurityContextHolder.MODE_GLOBAL
策略。其他应用程序可能希望让安全线程产生的线程也采用相同的安全身份。这可以通过使用SecurityContextHolder.MODE_INHERITABLETHREADLOCAL
来实现。您可以通过两种方式从默认的SecurityContextHolder.MODE_THREADLOCAL
更改模式。第一个是设置系统属性,第二个是在SecurityContextHolder
上调用静态方法。大多数应用程序不需要更改默认值,但是如果需要,请查看SecurityContextHolder
的JavaDoc了解更多信息。