Spring security Apache Web服务器背后的Spring Webapp-由CAS保护
我有一个使用Spring Security CAS保护的Web应用程序。CAS服务器和Webapp位于反向代理(名为url)的web服务器后面。webapp使用ServiceAuthenticationDetailsSource对动态服务URL进行身份验证。我遇到的问题是服务票证验证失败,因为验证期间提供的url与创建票证时提供的url不匹配。当使用https://:连接系统时,设置在没有Web服务器的情况下工作 问题似乎是web服务器在重定向到webapp时修改了HttpServletRequest,其中释放了“命名url”信息,并替换为and。服务票证是在登录期间通过“”service=“使用命名url获得的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
有什么可能的解决办法吗?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