11

在我的 Spring MVC 应用程序中,我想访问PrincipalSpring Security 在我的服务层中创建的对象。我曾考虑将它注入到我的服务类中,但我确信它不会是线程安全的。我在想的另一个选择是将它作为参数传递给所有服务方法,但这对我来说看起来不是很干净。这样做的更好方法是什么?

4

1 回答 1

22

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

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

Spring 在文档中解释了它是如何工作的:

最基本的对象是 SecurityContextHolder。这是我们存储应用程序当前安全上下文的详细信息的地方,其中包括当前使用应用程序的主体的详细信息。默认情况下,SecurityContextHolder 使用 ThreadLocal 来存储这些详细信息,这意味着安全上下文始终可用于同一执行线程中的方法,即使安全上下文没有作为参数显式传递给这些方法。如果在处理当前主体的请求后注意清除线程,那么以这种方式使用 ThreadLocal 是非常安全的。当然,Spring Security 会自动为您处理这些,因此您无需担心。

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

于 2013-08-15T09:56:52.607 回答