0

我有一个带有 RedhatSSO (Keycloak) 作为 OIDC 提供程序的 Spring Boot + Spring Security 应用程序。此应用程序部署在 Openshift 上,它为其分配如下路线:http://my-app.cloud.mycompany.com/. 该应用程序具有以下上下文路径:/my-app.

当我使用应用程序的 Openshift 路由地址访问受保护资源时http://my-app.cloud.mycompany.com/my-app/someProtectedResource,我被重定向到https://sso.mycompany.com我登录的 Keycloak 登录页面,然后我被发送回http://my-app.cloud.mycompany.com/my-app/sso/login. 然后它将代码交换为访问令牌并毫无问题地工作,允许访问受保护的路径。

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

当我输入http://intranet.mycompany.com/my-app/someProtectedResource请求时,我的应用程序在 Openshift 中的 pod 会重定向到https://sso.mycompany.com. 但是参数redirect_uri指向应用程序的 Openshift 路由地址的 URL,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',

弹簧靴:

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

4

1 回答 1

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 战争:

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

<http-listener name="default" proxy-address-forwarding="true" socket-binding="http" redirect-socket="https"/>
于 2018-03-08T08:14:12.120 回答