Закрыть сессию в spring security приложении
У меня есть Spring-boot-приложение с подключенной системой авторизации пользователей (spring-security). Есть обычные пользователи и пользователи-админы. Приложение хранит текущие сессии в БД:
spring.session.store-type=jdbc
Мне необходимо:
- Получить список текущих пользовательских сессий
- Досрочно прекратить сессии всех пользователей кроме определённого.
Дело в том, что все примеры в интернете описывают работу либо со своей сессией (установка доп. атрибутов) либо тот случай, когда сессии хранятся в памяти приложения (класс org.springframework.security.core.session.SessionRegistryImpl) а не в БД.
У меня же приложение может запускаться в кластере и сессии, повторюсь, хранятся в БД. Вариант с перехватом события создания сессии (интерфейс AuthenticationSuccessHandler) и хранением списка отдельно тоже мне не подходит, так как приложение может рестартовать с активными сессиями в БД.
Сейчас я решаю 2-й пункт "в лоб", вызываю native sql query:
UPDATE public.spring_session SET max_inactive_interval = 1 WHERE principal_name != 'admin' OR principal_name IS NULL
Но, быть может, есть какой-то более элегантный способ?
Ответы (1 шт):
Чувак, я бился с этим вопросом больше недели. Натыкался и на твой вопрос, который почти два года стоял без ответа.
Я решил эту фигню
инжектим это
private final FindByIndexNameSessionRepository<? extends Session> sessions;
делаем что-то вроде этого:
public void deleteAllUserSessions(Users user) { //посик активных сессий пользователя и их удаление Collection<? extends Session> usersSessions = this.sessions .findByPrincipalName(user.getUsername()).values(); for (Session userSession : usersSessions) { sessions.deleteById(userSession.getId()); }}