【问题标题】:Spring Webapp behind Apache Web Server - Secured by CASApache Web 服务器背后的 Spring Webapp - 由 CAS 保护
【发布时间】:2013-01-16 09:26:27
【问题描述】:

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

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

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

【问题讨论】:

    标签: spring-security apache cas


    【解决方案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
    

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

    自定义 AuthenticationDetailsS​​ource

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

    【讨论】:

      猜你喜欢
      • 2016-04-29
      • 2017-01-15
      • 1970-01-01
      • 2013-12-29
      • 1970-01-01
      • 2014-09-08
      • 2012-05-06
      • 2010-09-12
      相关资源
      最近更新 更多