【问题标题】:Why does requiresSecure() cause redirect loop in Spring Security?为什么 requiresSecure() 在 Spring Security 中会导致重定向循环?
【发布时间】:2014-12-11 11:43:05
【问题描述】:

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

问题是登录后,Spring Security 切换回 HTTP。我对此进行了阅读,发现添加以下内容会强制所有请求使用 HTTPS,这听起来正是我想要的:

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

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

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

【问题讨论】:

  • 哪里可以解决这个问题

标签: spring heroku spring-security spring-boot


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    server.forward-headers-strategy=native
    

    参考:Spring Boot Documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 2015-01-12
      • 1970-01-01
      • 2015-03-10
      • 1970-01-01
      相关资源
      最近更新 更多