Apache Web Server背后的Spring Webapp - 由CAS担保

时间:2013-02-01 04:57:48

标签: spring-security apache cas

我有一个使用Spring Security CAS保护的Web应用程序。 CAS服务器和Webapp位于Web服务器后面,用于反向代理(名为url)。 webapp使用ServiceAuthenticationDetailsS​​ource来验证动态服务URL。我遇到的问题是Service Ticket验证失败,因为验证期间提供的url与创建故障单时提供的url不匹配。使用https://:/。

连接系统时,设置无网络服务器

问题似乎是,当重定向到webapp时,Web服务器修改了HttpServletRequest,其中包含了“named url”信息,并被替换为和。服务票证是在登录期间使用名为url的“?service =”获得的。

任何可能的解决方案? apache可以在不修改请求的情况下重新路由请求,特别是对于自我识别的应用程序或CAS试图记录客户端IP地址的安全原因吗?

1 个答案:

答案 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非常灵活,因此您始终可以提供AuthenticationDetailsS​​ource的自定义实现,该实现返回ServiceAuthenticationDetails实例,以您希望的任何方式查找服务URL。