Я ссылаюсь на следующие руководства по объединению Keycloak OAuth2 и Spring Boot+Spring Gateway+Spring Security+Spring Session для сохранения http-сессии в Redis:
Я хотел бы контролировать время простоя пользователей, входящих в систему. Если пользователи, вошедшие в систему, совершат какие-либо действия в этот период простоя, они всегда сохранят статус входа.
Я обнаружил, что есть 2 параметра, которые я могу настроить:
Keycloak SSO Session Idle Time
в пользовательском интерфейсе KeycloakSpring Session Timeout
в Spring boot application.yml
После того, как пользователь вошел на мой сайт через Spring Gateway, я проверил TTL в Redis и всегда вижу, что он всегда один и тот же с Spring Session Timeout
, что, похоже, Keycloak SSO Session Idle Time
не работает.
Таким образом, пользователи будут перенаправляться на Keycloak после 30-минутного простоя при доступе к открытым конечным точкам Spring Gateway, а затем автоматически повторно входить в систему Keycloak и, наконец, перенаправляться обратно на Spring Gateway. Хотя пользователи могут продолжить работу на моем веб-сайте после 30 минут простоя, им все равно необходимо сначала перенаправиться на Keycloak, чтобы завершить процесс повторного входа в систему.
Насколько я понимаю, упомянутые выше 30 минут связаны только с Spring Session Timeout
, верно? Keycloak SSO Session Idle Time
здесь не имеет никакого значения. Пожалуйста, исправьте меня, если какая-либо ошибка.
У каждого пользователя есть два отдельных сеанса в вашей системе: один в Keycloak и другой в вашем BFF.
Эти сессии живут независимо друг от друга.
То, что вы настраиваете как тайм-аут сеанса единого входа в Keycloak, влияет только на сеанс Keycloak, а не на сеанс BFF. Это влияет на то, что происходит, когда пользователь перенаправляется в Keycloak (поскольку сеанс BFF не авторизован или срок действия токена обновления истек). Но это ничего не меняет в поведении BFF.
Да, у меня в интерфейсе используется метод refressh()
.
Хорошо. Я думаю, что мы не сможем вызвать refresh
во внешнем интерфейсе, если браузеры закрыты, а срок действия сеанса Spring Gateway также истечет на вашей стороне. Таким образом, вы также столкнетесь с проблемой: срок действия сеанса BFF истечет через 30 минут, поскольку время ожидания весеннего сеанса по умолчанию установлено на 30 минут - stackoverflow.com/questions/32501541/…
Мне кажется, это желательная функция: сеанс сохраняется, только если вкладка браузера остается открытой. Если вкладка закрыта и истекло время простоя сеанса BFF, сеанс закрывается. Просто настройте то, что вы хотите, в качестве тайм-аута сеанса.
Спасибо за отличные уроки по OAuth2 и BFF! Хорошо, я понимаю. Просто интересно, как вы обычно действовали в этом случае? Нужно ли нам вручную увеличивать время ожидания сеанса Spring Gateway (тайм-аут сеанса BFF), чтобы избежать частого выхода из сеанса Spring? В уроке я только что увидел
Schedule a refresh() call just before the access token expires (keep the session alive).
в6.2. User Service
. Используете ли выrefresh()
во Frontend, чтобы поддерживать сессию? Спасибо !