为安全上下文设置身份验证如何导致竞争条件

问题描述 投票:0回答:1

Spring

SecurityContextHolder
使用
ThreadLocal
来存储
SecurityContext
,它是线程本地的,不能被其他线程访问或修改。

但是在 spring 文档中,建议设置/创建新的安全上下文而不是使用

SecurityContextHolder.getContext().setAuthentication(authentication)
,因为它可能会导致竞争条件。

我不明白当

SecurityContext
是线程本地时,竞争条件是如何发生的。即使有多个线程同时执行,我也没有看到任何竞争条件发生。

请让我知道为什么在文档中提到它?

https://docs.spring.io/spring-security/reference/servlet/authentication/architecture.html#:~:text=We%20start%20by%20creating%20an%20empty%20SecurityContext.%20You%20should% 20create%20a%20new%20SecurityContext%20instance%20instead%20of%20using%20SecurityContextHolder.getContext().setAuthentication(authentication)%20to%20avoid%20race%20conditions%20across%20multiple%20threads.

java spring spring-boot spring-security
1个回答
0
投票

我认为 Spring 文档考虑以下原因:

  1. 某些应用程序可能不太适合 ThreadLocal 使用,因为它们采用了特定的线程模式。
  2. 例如,Swing 客户端更喜欢在 JVM 中的所有线程中使用相同的安全上下文。
  3. SecurityContextHolder 可以在启动时配置策略来指定上下文的存储方式。
  4. 独立应用程序可以利用带有 MODE_GLOBAL 策略的 SecurityContextHolder。
© www.soinside.com 2019 - 2024. All rights reserved.