使用Keycloak的Spring Boot应用程序,单点登录不在Apache Web Server后面工作

时间:2018-03-02 15:41:14

标签: spring-boot spring-security openshift keycloak redhat-sso

我有一个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。然后它交换访问令牌的代码,并且可以毫无问题地允许访问受保护的路径。

然而,这不是我们的目标场景,因为所有应用程序都是通过具有此URL http://intranet.mycompany.com的Apache服务器访问的。

当我输入http://intranet.mycompany.com/my-app/someProtectedResource时,请求会转到Openshift中我的应用程序的窗格,该窗格会重定向到https://sso.mycompany.com中的登录表单。但是,参数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

这样,成功登录后,我被发送到错误的地址,单点登录失败。

我正在使用此配置:

摇篮:

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',

Spring Boot:

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

如何让应用程序在Apache服务器后面实现redirect_uri应该有intranet.mycompany.com

1 个答案:

答案 0 :(得分:0)

我们正在使用两种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

在Tomcat上运行的Spring Boot jar:

要使服务器使用X-Fowarded-*标题,只需添加:

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

在JBoss上运行Spring Boot war:

更新standalone.xml设置proxy-address-forwarding="true"

<http-listener name="default" proxy-address-forwarding="true" socket-binding="http" redirect-socket="https"/>