Apache KeyClope+spring适配器+spring安全反向代理重定向到根目录
我们一直在使用Apache2.2反向代理在同一个VM上运行多个应用程序。在我们添加KeyClope适配器3.4.0.Final+spring security 1.5.9.RELEASE之前,一切都很顺利 这就是它的工作原理: VM1 附件1 附件2 VM2 钥匙斗篷 同一网络上的笔记本电脑 浏览器 app1-用于开发目的 场景: 1笔记本电脑-VM2和应用程序之间一切正常。 2在没有反向代理的情况下,在浏览器膝上型电脑-VM1-VM2之间一切正常,因此直接访问应用程序端口。 3反向代理到位时出现的问题。带mod_prox的浏览器笔记本电脑-VM1 Apache-VM2 我遵循了文档中的所有建议: 这是我以前的规矩:Apache KeyClope+spring适配器+spring安全反向代理重定向到根目录,apache,spring-security,reverse-proxy,keycloak,proxypass,Apache,Spring Security,Reverse Proxy,Keycloak,Proxypass,我们一直在使用Apache2.2反向代理在同一个VM上运行多个应用程序。在我们添加KeyClope适配器3.4.0.Final+spring security 1.5.9.RELEASE之前,一切都很顺利 这就是它的工作原理: VM1 附件1 附件2 VM2 钥匙斗篷 同一网络上的笔记本电脑 浏览器 app1-用于开发目的 场景: 1笔记本电脑-VM2和应用程序之间一切正常。 2在没有反向代理的情况下,在浏览器膝上型电脑-VM1-VM2之间一切正常,因此直接访问应用程序端口。 3反向代理到位时出
LoadModule proxy_module modules/mod_proxy.so
ProxyRequests On
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPassMatch ^/MyAPP/(.+) http://localhost:8585/MyAPP/$1
ProxyPassReverse ^/MyAPP/(.+) http://localhost:8585/MyAPP/$1
ProxyPreserveHost On
观察到:
GET VM1/MyAPP/index.html -> redirected to VM2 keycloak with the right redirect url
GET VM1/MyAPP/index.html?State=xxxx -> redirected to /MyAPP/index.html
GET VM1/MyAPP/index.html?State=xxxx -> redirected to /MyAPP/index.html
GET VM1/MyAPP/index.html?State=xxxx -> redirected to /MyAPP/index.html
GET VM1/MyAPP/index.html?State=xxxx -> redirected to /MyAPP/index.html
GET VM1/MyAPP/index.html?State=xxxx -> redirected to /MyAPP/index.html
GET VM1/MyAPP/index.html?State=xxxx -> redirected to /MyAPP/index.html
....
无限循环。我还注意到应用程序每次都在进行身份验证。
可疑
所以我开始怀疑是apache造成了问题,并决定尝试使用不同的代理:
哈普洛西。
它因同样的问题而失败。
但是我被重定向到/sso/login-intead
所以下一步是调试不同的请求:代理与非代理
VM1/MyAPP vs VM1:8585/MyAPP
因此,我发现每次请求具有授权头时,它都会对请求进行身份验证。这只发生在代理版本中
因此,在Apache2.2中,您不能删除头。这是刚刚在2.4中添加的
所以再次haproxy,并尝试以相同的方式强制删除授权头。它几乎成功了。我在请求方法为1而不是GET时遇到了一些问题。奇怪的
长话短说,很明显,基本作者是问题所在
如何解决这个问题
更新:
我现在的问题是:
如何更改keydapertificationentrypoint loginUri以在配置中包含反向代理的子上下文?
-在根目录上使用反向代理sso/登录不会使我在同一台服务器上拥有超过1个KeyClope应用程序。我是如何解决此问题的: 1所以第一步是禁用apache上的基本身份验证,因为它会干扰KeyClope授权过程,或者至少会干扰spring安全性 在这之后,我开始注意到我总是被重定向到root上的/sso/login 2为了解决这个问题,我添加了一个新的代理传递规则,将sso/登录请求重定向到我的服务器 ProxyPassMatch^/sso/login.*$1 ProxyPassReverse^/sso/login.*$1 在这之后,我仍然被重定向到/sso/login或者仅仅是根目录。 在尝试隐姓埋名模式后,我发现它确实有效。 尝试了不同的浏览器,效果也不错 3一些旧的会话状态仍然在我的浏览器上,因此清除了所有cookie,关闭了所有浏览器选项卡,重新启动了chrome,它开始工作 第二点有一个很大的缺陷。它不允许您在同一台服务器上有多个KeyClope适配器应用程序。为了改变弹簧侧的行为,我用两个过程来解决它。 -第一个是在keydapertificationentrypoint上重新设置登录uri
@Autowired
AdapterDeploymentContext adapterDeploymentContext;
private static final String OAUTH_LOGIN_URL = "/sso/login";
@Override
protected void configure(HttpSecurity http) throws Exception{
KeycloakAuthenticationEntryPoint keycloakAuthenticationEntryPoint =
new KeycloakAuthenticationEntryPoint(adapterDeploymentContext);
keycloakAuthenticationEntryPoint.setLoginUri(realSubContext + OAUTH_LOGIN_URL);
...
}
第二个是为sso登录添加重定向重写规则
钥匙斗篷:
重定向重写规则:
^/sso/login.*$:/MYSUBCONTEXT/sso/login$1
@Autowired
AdapterDeploymentContext adapterDeploymentContext;
private static final String OAUTH_LOGIN_URL = "/sso/login";
@Override
protected void configure(HttpSecurity http) throws Exception{
KeycloakAuthenticationEntryPoint keycloakAuthenticationEntryPoint =
new KeycloakAuthenticationEntryPoint(adapterDeploymentContext);
keycloakAuthenticationEntryPoint.setLoginUri(realSubContext + OAUTH_LOGIN_URL);
...
}