为什么requiresSecure()导致Spring Security中的重定向循环?

时间:2014-12-11 11:43:06

标签: spring heroku spring-security spring-boot

我正在使用Spring Boot v1.1.9.RELEASE,我将我的应用程序部署到Heroku。我刚刚添加了SSL证书,如果我手动将URL更改为HTTPS,它可以正常工作。

问题是登录后,Spring Security切换回HTTP。我已经阅读了这篇文章,发现添加以下内容会强制所有请求的HTTPS,这听起来就像我想要的那样:

.and().requiresChannel().anyRequest().requiresSecure()

然而,当我尝试这个时,我得到一个重定向循环错误。我不明白为什么服务器会不断重定向。我希望每个请求都是HTTPS。因此,如果请求是HTTP似乎有效,上面的代码告诉服务器重定向到HTTPS。但随后它一遍又一遍地重试重定向。有谁知道为什么这样做?日志似乎没有提供任何洞察行为。

注意:我也读过某个地方,端口映射可能是罪魁祸首,但建议的解决方案是将端口映射设置为80到443,据我所知是默认设置。无论如何我试过了它没有任何区别。

2 个答案:

答案 0 :(得分:1)

最可能的原因是HTTPS连接未在servlet容器处终止,并且容器无法区分通过HTTPS或HTTP的连接。

检查通过HTTPS发出请求时,HttpServletRequest上的isSecure方法是否返回true。如果没有,那么您需要找到一些配置Heroku应用程序的方法,以允许容器区分。路由器很可能会设置一个标题,例如HTTP_X_FORWARDED_PROTO,容器可以配置为使用。您可以使用RemoteIpValve在tomcat中执行此操作,但我不知道您在Heroku中对此有多少控制权。

答案 1 :(得分:0)

在Spring Boot中,可以在application.properties中激活Forwarded-Headers (RFC 7239)的用法:

server.forward-headers-strategy=native

参考:Spring Boot Documentation