Обновить принципала в сеансе при использовании Spring-Session

Мы расширили принцип с помощью нашего собственного объекта User. Таким образом, объект доступен при каждом запросе. Когда пользователь обновляет свою информацию, принципалу необходимо обновить эти новые данные. Если не используется spring-session, этот метод работает. Однако с весенней сессией это не так.

Я проверил код весенней сессии, и RedisOperationsSessionRepository:save(RedisSession session) вызывает только session.saveDelta(), который сохраняет только измененные атрибуты. Итак, как нам обновить принципала в сеансе?

Примечание. Место, где обновляется принципал, находится на уровне службы, поэтому у нас нет доступа к файлу SessionAuthenticationStrategy.


person nsdiv    schedule 15.12.2015    source источник


Ответы (1)


Нашел способ сделать это, поэтому отвечаю на свой вопрос. Spring-security сохраняет контекст как атрибут в HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY. Таким образом, обновление ключа вручную (вместо Spring-Session) приводит к обновлению принципала.

httpSession.setAttribute(
  HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY,
  SecurityContextHolder.getContext()
);
person nsdiv    schedule 16.12.2015