OpenId-Connect (OIDC) с Spring Security, но без липких сессий или центрального хранилища - PullRequest
0 голосов
/ 23 октября 2019

Мы хотим настроить наш сервис с аутентификацией OIDC на сервере keycloak.

Мы используем Spring Security 5.2.0 с Spring Boot 2.2.0.

Существует несколько экземпляров нашего сервиса, и мы не хотим делить между ними какие-либо состояния с центральным хранилищем (например, базы данных, распределенные кэши, ...) и не использовать липкие сеансы. Вот почему мы уже реализовали два пользовательских репозитория на основе файлов cookie для информации авторизации, которая обычно находится в сеансе на стороне сервера. (CookieBasedRequestCache и CookieBasedAuthorizationRequestRepository). Таким образом, поток перенаправления oidc работает, за исключением последнего шага, когда пользователь перенаправляется на исходный URL:

После успешного входа в систему keycloak перенаправляет обратно в наш экземпляр с кодом. Этот экземпляр (назовем его 'A') проверяет OAuth2AuthorizationResponse по первоначальному запросу авторизации keycloak. Он получает информацию из файла cookie, который мы сохранили ранее в процессе входа в систему, чтобы избежать управления сеансами Spring Security.

Теперь, если ответ на авторизацию успешно подтвержден, экземпляр «A» отправляет окончательное перенаправление на исходный URL-адрес, запрошенный пользователем перед входом в систему. Если на этот запрос отвечает тот же экземпляр «A», всеработает отлично. Но если другой экземпляр (скажем, «B») отвечает на запрос, он не работает, потому что B ничего не знает о состоянии аутентификации пользователя.

Вопросы:

  1. Существует ли репозиторий JWT на основе файлов cookie, который мы могли бы использовать для сохранения токена доступа между экземплярами? Или как его реализовать?

  2. Где в коде Spring Security (цепочка фильтров?) Проверяется, прошел ли аутентификация пользователя? Это было бы полезно для ответа на окончательный редирект на исходный URL.

...