Приложение Spring Boot, использующее Keycloak, единый вход не работает за веб-сервером Apache

У меня есть приложение Spring Boot + Spring Security с RedhatSSO (Keycloak) в качестве поставщика OIDC. Это приложение развернуто в Openshift, который определяет маршрут следующим образом: http://my-app.cloud.mycompany.com/, Приложение имеет этот контекстный путь: /my-app,

Когда я получаю доступ к защищенному ресурсу, используя адрес маршрута приложения Openshift, http://my-app.cloud.mycompany.com/my-app/someProtectedResource, Я перенаправлен на страницу входа Keycloak https://sso.mycompany.com где я захожу и возвращаюсь http://my-app.cloud.mycompany.com/my-app/sso/login, Затем он обменивает код на токен доступа и работает без каких-либо проблем, предоставляя доступ к защищенному пути.

Однако это не наш целевой сценарий, так как все приложения доступны через сервер Apache с этим URL http://intranet.mycompany.com,

Когда я вхожу http://intranet.mycompany.com/my-app/someProtectedResource запрос попадает в модуль моего приложения в Openshift, который перенаправляет на форму входа в https://sso.mycompany.com, НО URL-адрес redirect_uri указывает на адрес маршрута приложения Openshift http://my-app.cloud.mycompany.com/my-app/sso/login вместо http://intranet.mycompany.com/my-app/sso/login:

16:38:21,634 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-59) there was no code
16:38:21,634 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-59) redirecting to auth server
16:38:21,634 DEBUG [org.keycloak.adapters.OAuthRequestAuthenticator] (default task-59) callback uri: http://my-app.cloud.mycompany.com/my-app/sso/login

Таким образом, после успешного входа в систему меня отправляют не по адресу, и единый вход не выполняется.

Я использую эту конфигурацию:

Gradle:

springBootVersion = '1.5.10.RELEASE'
keycloakVersion = '3.4.3.Final'
...
mavenBom "org.keycloak.bom:keycloak-adapter-bom:${keycloakVersion}"
...
compile 'org.keycloak:keycloak-spring-boot-starter',
        'org.keycloak:keycloak-spring-security-adapter',

Весенний ботинок:

keycloak:
  auth-server-url: https://sso.mycompany.com/auth
  realm: MYREALM
  resource: my-app
  public-client: false
  principal-attribute: preferred_username
  credentials:
    secret: 99988877766655555444333
  autodetect-bearer-only: true
  ssl-required: external

Как сделать так, чтобы приложение осознало свою актуальность? redirect_uri должен иметь intranet.mycompany.com когда он находится за сервером Apache?

1 ответ

Решение

Мы используем два вида приложений Spring Boot и решили это для них обоих:

Прежде всего, это необходимая конфигурация Apache:

RequestHeader set "Host" "intranet.mycompany.com"
UseCanonicalName on
ProxyPreserveHost on

ProxyPass /my-app http://my-app.cloud.mycompany.com/my-app
ProxyPassreverse /my-app http://my-app.cloud.mycompany.com/my-app

Spring Boot jar работает на Tomcat:

Чтобы сервер использовал X-Fowarded-* Заголовки просто добавьте:

server:
  context-path: /my-app
  use-forward-headers: true

Весенняя война Boot, бегущая на JBoss:

Обновите свой standalone.xml установка proxy-address-forwarding="true":

<http-listener name="default" proxy-address-forwarding="true" socket-binding="http" redirect-socket="https"/>
Другие вопросы по тегам