Apache KeyClope+spring适配器+spring安全反向代理重定向到根目录

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反向代理到位时出

我们一直在使用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

我遵循了文档中的所有建议:

这是我以前的规矩:

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);
       ...
    }