Я использую spring безопасность в своем проекте.
У меня есть функция для изменения имени пользователя. Для достижения этой цели я использую следующий код
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;
Должен ли я обернуть свой код собственной синхронизацией для достижения видимости?
P.S.
Я прочитал qaru.site/info/240966/...
В приложение, которое получает одновременные запросы за один сеанс, тот же экземпляр SecurityContext будет разделяться между потоками. Даже хотя ThreadLocal используется, это тот же самый экземпляр, который извлекается из HttpSession для каждого потока. Это имеет последствия если вы хотите временно изменить контекст, под которым находится поток Бег. Если вы просто используете SecurityContextHolder.getContext() и вызываете setAuthentication (anAuthentication) на возвращаемом объекте контекста, то объект аутентификации будет изменяться во всех параллельных потоках которые имеют один и тот же экземпляр SecurityContext. Вы можете настроить поведение SecurityContextPersistenceFilter для создания полностью новый SecurityContext для каждого запроса, предотвращая изменения в одном потоке от воздействия на другое. В качестве альтернативы вы можете создать новый экземпляр просто в точке, где вы временно меняете контекст. Метод SecurityContextHolder.createEmptyContext() всегда возвращает новый контекстный экземпляр.
но я не понимаю, как spring гарантирует видимость. Есть только что написано, что каждый поток в сеансе увидит изменения. но нет ответа, как быстро? и что более важно - механизм видимости не объясняется