使用Spring Security需要通道和Amazon Elastic Load Balancer的登录循环

DD.*_*DD. 6 spring spring-security amazon-ec2

我正在尝试使用Amazon Elastic Load Balancer(ELB)在服务器上运行Spring安全性.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>
Run Code Online (Sandbox Code Playgroud)

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

DD.*_*DD. 3

事实证明,Spring Security 使用 ServletRequest.getServerPort() 来确定是否使用安全端口。我的 tomcat 配置为使用 8080 和 8443,因此当 ELB 将请求从 443 转发到 8443 上的内部 tomcat 时,web 应用程序不接受此端口作为安全端口:

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

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

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