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