使用 Spring Security requires-channel 和 Amazon Elastic Load Balancer 的登录循环

Posted

技术标签:

【中文标题】使用 Spring Security requires-channel 和 Amazon Elastic Load Balancer 的登录循环【英文标题】:Login loop with Spring Security requires-channel and Amazon Elastic Load Balancer 【发布时间】:2011-09-18 07:57:32 【问题描述】:

我正在尝试让我的 Spring Security 在使用 Amazon Elastic Load Balancer (ELB) 的服务器上运行。 ELB 在端口 80 上配置为在端口 8080 上转发到我的应用程序,在端口 443 上也配置为转发到 8080。

<security:intercept-url pattern="/login.xhtml"  access="IS_AUTHENTICATED_ANONYMOUSLY" requires-channel="https"  />

<security:port-mappings>
            <security:port-mapping http="80" https="443" />
</security:port-mappings>

每当我访问此页面时,我都会进入登录循环。知道如何解决这个问题吗?不确定 Spring Security 是否存在问题,因为 ELB 将流量从 https 端口 443 转发到我的应用程序的端口 8080。

【问题讨论】:

端口映射是否应该在我的应用程序的内部端口上引用ELB上的外部端口? 重定向循环几乎总是会发生,因为您有一个不应该受到保护的安全 URL。启用调试日志,您应该会看到重定向的原因。这将帮助您调试日志static.springsource.org/spring-security/site/…(搜索调试页面)。 【参考方案1】:

事实证明,Spring Security 使用 ServletRequest.getServerPort() 来确定它是否使用了安全端口。我的 tomcat 是使用 8080 和 8443 配置的,所以当 ELB 将请求从 443 转发到我在 8443 上的内部 tomcat 时,webapp 不接受这个作为安全端口:

20 Jun 18:16:49,184 ["http-bio-8443"-exec-5] DEBUG org.springframework.security. web.access.channel.RetryWithHttpsEntryPoint  - Redirecting to: /login.xhtml

我也尝试使用代理端口,但无法让它工作。 此外,如果您将 spring 安全端口配置为使用 8443,则它不会正确执行重定向(它会将应用程序重定向到外部不存在的 8443)。

长话短说...以下设置有效: ELB 前向 80->80 和 443->443。 设置 tomcat 使用 80 和 443。 在 Spring Security 上设置端口映射以使用 80 和 443

【讨论】:

我必须在 tomcat 连接器上使用 proxyPort 作为 443,否则由于某种原因重定向不起作用。 首先,设置 tomcat 监听 80 或 443 (link【参考方案2】:

重定向循环几乎总是会发生,因为您有一个不应受到保护的安全 URL。 Spring Security 中默认所有 URL 都是安全的。

此外,如果登录页面使用单独的请求加载 javascript、CSS 或图像资源,它们的 URL 也会受到保护,这可能会导致循环。

启用调试日志,您应该会看到重定向的原因。 This 将帮助您进行调试日志记录(搜索调试页面)。

【讨论】:

以上是关于使用 Spring Security requires-channel 和 Amazon Elastic Load Balancer 的登录循环的主要内容,如果未能解决你的问题,请参考以下文章

Spring Security:SSL 加速器后面的 requires-channel="https"

Spring security:使用注释强制 https?

Spring Security 3.2 CSRF 禁用特定 URL

如何使用 Spring Security 仅接受 https 流量并拒绝所有 http 流量?

Spring Framework,Spring Security - 可以在没有 Spring Framework 的情况下使用 Spring Security?

Kubernetes中的Security Context, Resource requirement和Service Account