Spring security Apache Web服务器背后的Spring Webapp-由CAS保护

Spring security Apache Web服务器背后的Spring Webapp-由CAS保护,spring-security,apache,cas,Spring Security,Apache,Cas,我有一个使用Spring Security CAS保护的Web应用程序。CAS服务器和Webapp位于反向代理(名为url)的web服务器后面。webapp使用ServiceAuthenticationDetailsSource对动态服务URL进行身份验证。我遇到的问题是服务票证验证失败,因为验证期间提供的url与创建票证时提供的url不匹配。当使用https://:连接系统时,设置在没有Web服务器的情况下工作 问题似乎是web服务器在重定向到webapp时修改了HttpServletRequ

我有一个使用Spring Security CAS保护的Web应用程序。CAS服务器和Webapp位于反向代理(名为url)的web服务器后面。webapp使用ServiceAuthenticationDetailsSource对动态服务URL进行身份验证。我遇到的问题是服务票证验证失败,因为验证期间提供的url与创建票证时提供的url不匹配。当使用https://:连接系统时,设置在没有Web服务器的情况下工作

问题似乎是web服务器在重定向到webapp时修改了HttpServletRequest,其中释放了“命名url”信息,并替换为and。服务票证是在登录期间通过“”service=“使用命名url获得的


有什么可能的解决办法吗?apache是否可以在不修改请求的情况下重新路由请求,特别是对于自识别的应用程序,或者出于安全原因,CAS正在尝试记录客户端IP地址?

我在下面概述了几个选项:

设置反向代理

根据的Javadoc:HttpServletRequest.getServerName()将是:

主机标头值中“:”之前部分的值(如果有),或 解析的服务器名称或服务器IP地址

这意味着您可以配置代理以确保正确设置主机头(请注意,有些容器(如WebSphere)不遵守该规范)

使用容器配置覆盖

许多服务器的设置可以在使用反向代理时覆盖此值。下面我总结了一个相当不错的例子,其中包含了更多的信息

如果您使用的是Tomcat,我会参考。一种配置方法是将配置为具有proxyName属性以覆盖HttpServletRequest.getServerName()返回的值,并配置proxyPort以覆盖HttpServletRequest.getServerPort()返回的值。示例配置可能如下所示:

server.xml

<Connector scheme="https" secure="true" 
    proxyPort="443" proxyName="example.com"
    port="8009" protocol="AJP/1.3"
    redirectPort="8443" maxThreads="750" 
    connectionTimeout="20000" />
如果您没有使用这些容器中的任何一个,或者需要支持多个域,则需要查阅容器文档

自定义身份验证详细信息来源

当然,Spring安全性非常灵活,因此您可以始终提供AuthenticationDetailsSource的自定义实现,该实现返回ServiceAuthenticationDetails的实例,该实例以您希望的任何方式查找服务URL

com.ibm.ws.webcontainer.extractHostHeaderPort = true
trusthostheaderport = true
httpsIndicatorHeader = com.ibm.ws.httpsIndicatorHeader