Я успешно установил Keycloak и общедоступное / front-end приложение для весенней загрузки. Все работает как положено. Внешнее приложение Spring Boot настроено в Keycloak как клиент (app-ui) в области, пользователь может войти через keycloak, токены успешно проходят все отлично. Spring Security обеспечивает безопасность конечных точек, и для конечных точек уважаются роли.
Теперь я пытаюсь добавить в смесь нижестоящее Spring Boot App (веб-сервис), и я хочу, чтобы он знал о вошедшем в систему пользователе, чтобы иметь возможность защищать вызовы к нему. Внешнее приложение Spring Boot использует Feign Client для вызова конечных точек REST на внутреннем Spring Boot App, но сервер не выполняет аутентификацию / авторизацию.
У меня есть пара вопросов, которые я не могу понять:
- Как настроить внешнее приложение Spring Boot для передачи данных аутентифицированного пользователя во внутреннее приложение Spring Boot (RequestInterceptor / RestTemplate / Feign config / Http Headers)?
- Как настроить внутреннее Spring Boot App для использования данных аутентифицированного пользователя, которые он получает из вышестоящего Spring Boot App, и какие зависимости мне нужно добавить в фоновое Spring Boot App, чтобы облегчить это (org. keycloak: keycloak-spring-boot-starter и org.springframework.boot: spring-boot-starter-security)?
- Что-нибудь нужно настроить в Keycloak для внутреннего Spring Spring Boot App? Должен ли он быть зарегистрирован в Keycloak как конфиденциальный / непубличный клиент (например, app-api)?
- Есть ли что-то конкретное для настройки в бэкэнд-приложении Spring Boot? Говорит ли он с Keycloak, чтобы проверить данные аутентифицированного пользователя, которые он получает от вызывающих абонентов?
Я бы хотел увидеть демонстрацию или учебник, в котором рассказывается о том, что я видел, на How to integrate Keycloak and Spring Boot
шаг вперед, чтобы также защитить другие нисходящие сервисы. Если я смогу это выяснить, я выложу один.
Я предполагаю, что это можно сделать с помощью стандартной конфигурации OAuth2 в внутреннем Spring Boot App, но я не был уверен, как это рекомендуется для достижения этой архитектуры.
Вот архитектура, которую я пытаюсь настроить: