Приложение 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"/>