0

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

问题似乎是Web服务器在重定向到Web应用程序时修改了HttpServletRequest,其中丢失了“命名的url”信息并被替换为 and 。服务票证是在登录时通过“?service=”使用命名的url获取的。

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

4

1 回答 1

1

我在下面概述了一些选项:

设置反向代理

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

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

这意味着您可以配置您的代理以确保正确设置主机标头(请注意,某些容器(例如 WebSphere)虽然不遵守规范)。

使用容器配置覆盖

如果您使用反向代理,许多服务器的设置可以覆盖此值。Spring 论坛上有一个相当不错的线程,其中包含我在下面总结的更多信息。

如果您使用的是 Tomcat,我会参考反向代理设置页面。一种配置方法是将Http 连接器配置为具有 proxyName 属性以覆盖由 HttpServletRequest.getServerName() 和 proxyPort 以覆盖由 HttpServletRequest.getServerPort() 返回的值。示例配置可能如下所示:

服务器.xml

<Connector scheme="https" secure="true" 
    proxyPort="443" proxyName="example.com"
    port="8009" protocol="AJP/1.3"
    redirectPort="8443" maxThreads="750" 
    connectionTimeout="20000" />

Websphere 有一些自定义属性可以做同样的事情。

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

如果您不使用这些容器中的任何一个或需要支持多个域,则需要查阅容器文档。

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

当然 Spring Security 非常灵活,因此您始终可以提供 AuthenticationDetailsS​​ource 的自定义实现,该实现返回一个 ServiceAuthenticationDetails 实例,该实例以您希望的任何方式查找服务 URL。

于 2013-02-01T16:52:44.217 回答