如何让 SpringSecurity/Grails 与终止 SSL 的负载均衡器很好地配合使用

Posted

技术标签:

【中文标题】如何让 SpringSecurity/Grails 与终止 SSL 的负载均衡器很好地配合使用【英文标题】:How to get SpringSecurity/Grails to play nicely with a Load Balancer that is terminating SSL 【发布时间】:2015-02-09 08:50:15 【问题描述】:

我们在 Tomcat 上部署了一个 Grails 应用程序,该应用程序部署在终止 SSL 的负载均衡器后面(负载均衡器随后与端口 8080 上的 tomcat 实例通信)。我们已将 SpringSecurity 配置为要求所有资源上的安全通道,注意来自负载均衡器的标头,强制使用 https 并映射来自负载均衡器的端口:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.auth.forceHttps = true
grails.plugin.springsecurity.portMapper.httpPort = 80
grails.plugin.springsecurity.portMapper.httpsPort = 443
grails.plugin.springsecurity.secureChannel.definition = [
        '/**': 'REQUIRES_SECURE_CHANNEL'
]

其中大部分工作正常 - 来自 Grails 内部的重定向按预期使用 https 协议,以及大多数 ajax 请求。

有一些 ajax 请求,但是 没有 正常工作。它们都与与 j_spring_security* 端点(如 j_spring_security_check)交互的结果有关。例如,如果用户尝试通过 ajax 登录,我们会在浏览器中收到此错误(这是成功登录发起的重定向):

 Mixed Content: The page at 'https://www.servernamehere.com/' was loaded over HTTPS, but 
 requested an insecure XMLHttpRequest endpoint 'http://www.servernamehere.com/login/ajaxSuccess'.
 This request has been blocked; the content must be served over HTTPS.

身份验证失败时也会出现同样的问题:

Mixed Content: The page at 'https://www.servernamehere.com/' was loaded over HTTPS, but requested 
an insecure XMLHttpRequest endpoint 'http://www.servernamehere.com/login/authfail?ajax=true'. 
This request has been blocked; the content must be served over https.

我们如何配置spring security来理解所有来自身份验证事件的重定向都需要是https?

【问题讨论】:

【参考方案1】:

我有一个类似的设置,我在我的 Grails 应用程序中设置了 SecureChanel 标头,如下所示:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.portMapper.httpPort = 80
grails.plugin.springsecurity.portMapper.httpsPort = 443
grails.plugin.springsecurity.secureChannel.secureHeaderName = 'X-Forwarded-Proto'
grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'X-Forwarded-Proto'
grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'

Grails spring 安全插件https://github.com/grails-plugins/grails-spring-security-core/issues/395 的两个版本(2.x、3.x)都存在一个错误,但它已经修复了......

【讨论】:

【参考方案2】:

我们能够通过创建自定义重定向策略(实现 org.springframework.security.web.RedirectStrategy)并用我们的自定义重定向策略替换默认重定向策略 bean 来解决此问题。自定义重定向策略检查负载均衡器传入的标头,并确保将响应重定向到适当的协议

【讨论】:

Mike,在这里也遇到了同样的问题,你能发一个你做过的例子吗?谢谢! 我遇到了完全相同的问题。可以举个例子吗?

以上是关于如何让 SpringSecurity/Grails 与终止 SSL 的负载均衡器很好地配合使用的主要内容,如果未能解决你的问题,请参考以下文章

如何让apache显示目录

Jfreechart柱状图如何让变成纯色

android中如何让文字环绕图片

如何让GridView 标题居中

请教如何让UIActivityIndicatorView永远居中

如何让ActionBar标题居中