Есть ли какой-нибудь правильный способ обновить это значение без пользователя нужно выйти из системы (и, таким образом, удалить сохраненный сеанс Redis) и снова войти в систему?
Пока я пытаюсь:
Код: Выделить всё
@RequiredArgsConstructor
@Service
public class RedisService {
private static final String PRINCIPAL_INDEX = "spring:session:index:" + FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME;
private static final String ID = "spring:session:sessions:";
@Autowired
private RedisIndexedSessionRepository sessionRepository;
@Autowired
private RedisTemplate redisTemplate;
public void updateUserValue(String email) {
// Retrieve the session using the email (principal)
Map sessions = sessionRepository.findByPrincipalName(email);
if (!sessions.isEmpty()) {
// Loop through all sessions (if multiple exist)
for (Session session : sessions.values()) {
// Get the SecurityContext from the session
SecurityContext securityContext = session.getAttribute("SPRING_SECURITY_CONTEXT");
// Get the Redis key for the session data
String sessionRedisKey = "spring:session:sessions:" + session.getId();
if (securityContext != null) {
Authentication authentication = securityContext.getAuthentication();
ClientPrincipal principal = (ClientPrincipal) authentication.getPrincipal();
// update user's authorities
principal.setAuthorities(new CustomAuthority());
// Update the session with the modified SecurityContext
session.setAttribute("SPRING_SECURITY_CONTEXT", securityContext);
securityContext.setAuthentication(authentication);
redisTemplate.opsForHash().put(sessionRedisKey, "sessionAttr:SPRING_SECURITY_CONTEXT", securityContext);
}
}
} else {
throw new RuntimeException("No session found for principal: " + email);
}
}
}
Код: Выделить всё
ClientPrincipal
но по какой-то причине это не обновляет значение в Redis. В Redis не было создано никакого дополнительного ключа, что должно указывать на то, что сериализация ключей не создает проблем. Я также использую автоматически настроенные Spring RedisIndexedSessionRepository и RedisTemplate по умолчанию, поэтому сериализация значений также должна быть правильной.
Также изменился «lastAccessedTime» ключа в redis. , однако значение остается прежним, даже попытка использовать фиктивные значения не работает.
Что может вызвать проблемы? Каким-то образом пружина предотвращает прямые обновления?
В качестве обходного пути для прямого манипулирования значением Redis я думал о создании фильтра, который проверял бы наличие обновлений, а затем обновлял сам сеанс (поскольку изменения в сеансе должно быть отражено в Redis, если у нас есть HttpSession), но это похоже на крайнюю меру.
Спасибо за помощь
Подробнее здесь: https://stackoverflow.com/questions/790 ... -to-httpre