Лучший способ обновить значение сеанса, хранящееся в Redis, без доступа к HttpRequest или SecurityContextHolderJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Лучший способ обновить значение сеанса, хранящееся в Redis, без доступа к HttpRequest или SecurityContextHolder

Сообщение Anonymous »

У меня есть приложение, которое использует Redis для хранения сеанса, включая объект аутентификации, с использованием Spring-Boot.
Есть ли какой-нибудь правильный способ обновить это значение без пользователя нужно выйти из системы (и, таким образом, удалить сохраненный сеанс 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
— это моя собственная реализация UserDetails
но по какой-то причине это не обновляет значение в Redis. В Redis не было создано никакого дополнительного ключа, что должно указывать на то, что сериализация ключей не создает проблем. Я также использую автоматически настроенные Spring RedisIndexedSessionRepository и RedisTemplate по умолчанию, поэтому сериализация значений также должна быть правильной.
Также изменился «lastAccessedTime» ключа в redis. , однако значение остается прежним, даже попытка использовать фиктивные значения не работает.
Что может вызвать проблемы? Каким-то образом пружина предотвращает прямые обновления?
В качестве обходного пути для прямого манипулирования значением Redis я думал о создании фильтра, который проверял бы наличие обновлений, а затем обновлял сам сеанс (поскольку изменения в сеансе должно быть отражено в Redis, если у нас есть HttpSession), но это похоже на крайнюю меру.
Спасибо за помощь

Подробнее здесь: https://stackoverflow.com/questions/790 ... -to-httpre
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»