我有一个使用Spring Security CAS保护的Web应用程序。 CAS服务器和Webapp位于Web服务器后面,用于反向代理(名为url)。 webapp使用ServiceAuthenticationDetailsSource来验证动态服务URL。我遇到的问题是Service Ticket验证失败,因为验证期间提供的url与创建故障单时提供的url不匹配。使用https://:/。
连接系统时,设置无网络服务器问题似乎是,当重定向到webapp时,Web服务器修改了HttpServletRequest,其中包含了“named url”信息,并被替换为和。服务票证是在登录期间使用名为url的“?service =”获得的。
任何可能的解决方案? apache可以在不修改请求的情况下重新路由请求,特别是对于自我识别的应用程序或CAS试图记录客户端IP地址的安全原因吗?
答案 0 :(得分:1)
我在下面列出了几个选项:
设置反向代理
根据ServletRequest的Javadoc:HttpServletRequest.getServerName()将是:
Host标头值中“:”之前的部分的值,如果有的话,或者 已解析的服务器名称或服务器IP地址。
这意味着您可以配置代理以确保正确设置主机标头(注意某些像WebSphere这样的容器不遵守规范)。
使用容器配置覆盖
许多服务器都有一个设置,可以在您使用反向代理时覆盖此值。有一个相当不错的thread on the Spring forums,其中有更多的信息,我在下面总结了。
如果您使用的是Tomcat,我会参考Reverse Proxy setup page。一种配置方法是配置Http Connector以使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" />
Websphere有一些custom properties做同样的事情。
com.ibm.ws.webcontainer.extractHostHeaderPort = true
trusthostheaderport = true
httpsIndicatorHeader = com.ibm.ws.httpsIndicatorHeader
如果您没有使用这些容器中的任何一个或需要支持多个域,则需要查阅容器文档。
自定义身份验证详细信息
当然,Spring Security非常灵活,因此您始终可以提供AuthenticationDetailsSource的自定义实现,该实现返回ServiceAuthenticationDetails实例,以您希望的任何方式查找服务URL。