在我的spring MVC应用程序中,我想访问我的服务层中由spring security创建的Principal
对象。我想在我的服务类中注入它,但我相信它不会是线程安全的。
我想的其他选择是将它作为参数传递给所有服务方法,但这对我来说看起来不太干净。
什么是更好的方法呢?
答案 0 :(得分:14)
我认为最好的方法是使用SecurityContextHolder
。
Principal principal = SecurityContextHolder.getContext().getAuthentication();
Spring解释了它在documentation:
中的工作原理最基本的对象是SecurityContextHolder。这就是我们的地方 存储应用程序当前安全上下文的详细信息, 其中包括目前使用的主要人员的详细信息 应用。默认情况下,SecurityContextHolder使用ThreadLocal 存储这些细节,这意味着安全上下文 始终可用于同一执行线程中的方法,即使 安全上下文未作为参数显式传递 那些方法。如果小心,以这种方式使用ThreadLocal是非常安全的 在本委托人的要求之后,我们会采取行动 处理。当然,Spring Security会为您解决这个问题 自动,所以没有必要担心它。
由于它使用ThreadLocal
来存储当前身份验证,因此您不会遇到任何线程安全问题。