我有一个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
?
答案 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"/>