Как обрабатывается изменение прав доступа при активной сессии
Что проверяют
Понимаете ли вы, что права пользователя обычно вычисляются один раз при входе и дальше живут в сессии или токене. Интервьюер хочет услышать, как вы закроете окно, в котором разжалованный администратор ещё час работает со старыми правами. Следом спрашивают, как это решается при JWT без сессий.
Как отвечать
Сначала опишите проблему на Spring Security: после входа Authentication с набором GrantedAuthority лежит в SecurityContext, а тот сохраняется в HttpSession. Смена роли в базе на него не влияет, пока пользователь не войдёт заново.
Дальше варианты, от жёсткого к мягкому:
- принудительный выход: при понижении прав завершить все сессии пользователя. Со стандартными сессиями это
SessionRegistry.getAllSessions(principal, false)иexpireNow()у каждой, реестр наполняется, только когда включён контроль параллельных сессий. Со Spring Session на Redis сессии пользователя находятся черезFindByIndexNameSessionRepository.findByPrincipalName; - версия прав: у пользователя в базе хранится счётчик, который растёт при каждой смене ролей. Фильтр сравнивает версию из сессии с актуальной (из кеша с коротким TTL) и при расхождении перечитывает authorities или отправляет на вход;
- проверка на каждом запросе: для критичных операций права читаются из базы в момент вызова, например в
@PreAuthorizeчерез свой бин. Дороже, зато без задержки; - JWT: роли зашиты в токен до его истечения. Поэтому access-токен делают коротким, от 5 до 15 минут, а при обновлении по refresh-токену роли перечитываются. Для мгновенного отзыва нужен чёрный список или версия токена, которую проверяет сервер.
В кластере сессии выносят в общее хранилище, иначе инвалидировать их придётся на каждом узле.
Где спотыкаются
Предлагают HttpSessionListener. Он срабатывает только на создание и уничтожение сессии и о смене прав ничего не знает.
Утверждают, что stateless JWT решает проблему сам. Наоборот, выданный токен действует до истечения, и без короткого срока жизни или отзыва права не обновятся.
Не различают расширение и сужение прав. Выдачу роли можно подхватить при следующем входе, а отзыв должен срабатывать сразу, иначе это дыра в безопасности.