Spring Keycloak аутентификация - обслуживает как веб-приложение, так и веб-сервис - PullRequest
0 голосов
/ 06 января 2020

Наш стек включает в себя следующие службы, каждая служба работает в контейнере docker:

  • Front-end в React
  • Бэкэнд-сервис на основе Spring boot "resource-service "
  • Keycloak
  • Другие бэкэнд-сервисы (потребитель)

И интерфейсные, и пользовательские сервисы обмениваются данными с бэкэндом с помощью REST API. Мы используем Keycloak в качестве службы управления и аутентификации пользователей.

Мы хотели бы интегрировать нашу службу ресурсов «Spring-service» с Keycloak, обслуживая как веб-приложения, так и потоки услуг:

  1. Веб-приложение - реагирование на основе front-send, которое должно получить перенаправление 302 от «службы ресурсов» и отправить пользователя / браузера для входа в систему на сайте Keycloak, а затем вернуться, чтобы получить запрошенный ресурс.

  2. Сервер 2 Соединение сервера - сервер, которому необходимо использовать API «resource-service», должен получить 401 в случае проблем с аутентификацией, а не страницу перенаправления / входа в систему.

Существует несколько вариантов интеграции Spring с Keycloak:

  1. Адаптер Keycloak Spring Boot
  2. Адаптер Keycloak Spring Security
  3. Spring Security и OAuth2

Я заметил, что в документации по Keycloak есть «autodetect-only-bearer», которая, кажется, поддерживает именно этот случай. Но - Есть много вариантов интеграции, и я не уверен, как лучше всего использовать go для новой службы загрузки Spring. Кроме того, я не нашел, где настроить это свойство.

1 Ответ

0 голосов
/ 06 января 2020

Я использовал подходы один и два, и, по моему мнению, если вы используете Spring Boot, используйте соответствующий адаптер, используйте адаптер Spring Security, если вы все еще используете обычный Spring MVC. Я никогда не видел необходимости в третьем подходе, так как в основном вы должны делать все самостоятельно, почему бы никому не использовать первые два метода?

Что касается использования адаптера Spring Bood, единственная необходимая конфигурация это следующее:

keycloak:
  bearer-only: true
  auth-server-url: your-url
  realm: your-realm
  resource: your-resource

И все готово. Только для канала-носителя вы возвращаете 401, если клиент приходит без маркера-носителя и не перенаправляется на страницу входа, как вы хотели. По крайней мере, это то, что работает для нас: -)

После этого вы можете либо использовать конфигурацию для защиты конечных точек, но это немного более гибко, либо использовать httpSecurity или @EnableGlobalMethodSecurity, что мы делаем, например, с @Secured ({"ROLE_whwhat_role"}).

Если вы используете новейшую версию Spring Boot в сочетании с Spring Cloud, вы можете столкнуться с этой проблемой .

...