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

时间:2013-08-15 09:52:19

标签: spring spring-mvc spring-security

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

1 个答案:

答案 0 :(得分:14)

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

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

Spring解释了它在documentation

中的工作原理
  

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

由于它使用ThreadLocal来存储当前身份验证,因此您不会遇到任何线程安全问题。