问题 在服务方法中获取主要用户对象


在我想要访问的春季MVC应用程序中 Principal 我的服务层中由spring security创建的对象。我想在我的服务类中注入它,但我相信它不会是线程安全的。 我想的其他选择是将它作为参数传递给所有服务方法,但这对我来说看起来不太干净。 有什么比这更好的方法呢?


4925
2017-08-15 09:52


起源



答案:


我认为最好的方法是使用 SecurityContextHolder

Principal principal = SecurityContextHolder.getContext().getAuthentication();

Spring解释了它是如何工作的 文件

最基本的对象是SecurityContextHolder。这就是我们的地方   存储应用程序当前安全上下文的详细信息,   其中包括目前使用的主要人员的详细信息   应用。默认情况下,SecurityContextHolder使用ThreadLocal   存储这些细节,这意味着安全上下文   始终可用于同一执行线程中的方法,即使   安全上下文未作为参数显式传递   那些方法。如果小心,以这种方式使用ThreadLocal是非常安全的   在本委托人的要求之后,我们会采取行动   处理。当然,Spring Security会为您解决此问题   自动,所以没有必要担心它。

因为它使用了 ThreadLocal 存储当前的身份验证,您将不会遇到任何线程安全问题。


14
2017-08-15 09:56