何时使用不同的SecurityContextHolder策略?

时间:2019-03-29 18:54:53

标签: java spring spring-security

我正在阅读Spring Security文档,其中说SecurityContextHolder为具有特定线程行为的应用程序提供了不同类型的策略。例如-Swing应用程序。

我了解到,在网络应用中,我们可以使用ThredLocal策略。但是什么时候使用其他两种策略以及它们如何工作,我无法理解。

1 个答案:

答案 0 :(得分:0)

请参见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上调用静态方法。大多数应用程序都不需要更改默认设置,但是如果需要,请查看JavaDoc for SecurityContextHolder以了解更多信息。