SecurityContext#setAuthentication 是否保证可见性?
我在我的项目中使用弹簧安全性。
我有更改登录的功能。为了实现这个目标,我使用以下代码
Authentication authentication = ...
SecurityContextHolder.getContext().setAuthentication(authentication);
但是现在我正在详细地研究此代码,并看到身份验证字段不是因此不能保证可见性:volatile
public class SecurityContextImpl implements SecurityContext {
private static final long serialVersionUID = SpringSecurityCoreVersion.SERIAL_VERSION_UID;
// ~ Instance fields
// ================================================================================================
private Authentication authentication;
我是否应该使用自己的同步来包装代码以实现可见性?
附言
我已阅读 https://stackoverflow.com/a/30781541/2674303
在单个会话中接收并发请求的应用程序中,将在线程之间共享相同的 SecurityContext 实例。即使正在使用 ThreadLocal,它也是从 HttpSession 中为每个线程检索的同一实例。如果您希望临时更改线程运行的上下文,这将产生影响。如果您只使用 SecurityContextHolder.getContext(),并在返回的上下文对象上调用 setAuthentication(anAuthentication),则身份验证对象将在共享同一 SecurityContext 实例的所有并发线程中更改。您可以自定义 SecurityContextPersistenceFilter 的行为,为每个请求创建一个全新的 SecurityContext,从而防止一个线程中的更改影响另一个线程。或者,您可以在临时更改上下文时创建新实例。方法 SecurityContextHolder.createEmptyContext() 始终返回一个新的上下文实例。
但我不明白春天如何保证能见度。刚刚写到会话中的每个线程都将看到更改。但是没有答案有多快?更重要的是 - 可见性机制没有解释