Grails Spring Security使用https重定向到登录页面

时间:2013-12-13 17:39:23

标签: grails redirect login https spring-security

我有一个Grails应用程序使用在负载均衡器后面的AWS机器上运行的Spring Security Core。

负载均衡器解密ssl连接并转发到我们实例的端口8080,添加适当的X-Forwarded-Proto标头。

我希望能够使用https直接访问受保护的页面以重定向到登录页面。

例如,请求https://myapp.com/private/page应重定向到https://myapp.com/login/auth

我把它放在config.groovy中:

grails.plugin.springsecurity.secureChannel.definition = [
    '/login/**':        'REQUIRES_SECURE_CHANNEL'
]

但这导致重定向循环(HTTP代码302)到http登录页面(http://myapp.com/login/auth

然后我尝试了:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.auth.forceHttps = true

但这导致重定向(HTTP代码302)到http登录页面(http://myapp.com/login/auth

  1. 这个问题仅限于生产设置(战争部署在负载均衡器后面的Tomcat)。
  2. 如果我在我的loacal开发机器上测试相同的config.groovy,重定向到https://myapp.com/login/auth就好了。
  3. 我尝试为spring安全性指定一个不同的httpsPort,它再次在我的本地开发机器上工作,但在部署的应用程序中完全被忽略,它会一直重定向到http
  4. 没有运气潜伏在类似的帖子,任何想法?

3 个答案:

答案 0 :(得分:7)

我还使用https和负载均衡器在AWS上使用Spring Security Core 2.0-RC4托管我的Grails应用程序,感谢AWS的spock99和Ravi L,我得到了它。

我在config.groovy中执行了以下操作:

    // Required because user auth uses absolute redirects
    grails.serverURL = "http://example.com"

    grails.plugin.springsecurity.secureChannel.definition = [
        '/assets/**':     'ANY_CHANNEL',// make js, css, images available to logged out pages
        '/**':            'REQUIRES_SECURE_CHANNEL',
    ]

    // overriding values in DefaultSecurityConfig.groovy from the SpringSecurityCore 2.0-RC4 
    grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
    grails.plugin.springsecurity.portMapper.httpPort = 80
    grails.plugin.springsecurity.portMapper.httpsPort = 443

注意:Spring Security Core 2.0-RC4中不需要以下内容 - 它们已经在DefaultSecurityConfig.groovy中

    secureHeaderName = 'X-Forwarded-Proto'
    secureHeaderValue = 'http'
    insecureHeaderName = 'X-Forwarded-Proto'
    insecureHeaderValue = 'https'

我变得虚假'不健康'阅读因为击中' /'返回302重定向到/ login / auth,所以我将一个health()方法添加到HomeController(我映射到' / health')以供AWS点击:

    class HomeController {
        @Secured('IS_AUTHENTICATED_FULLY')
        def index() { }

        @Secured('permitAll')
        def health() { render '' }
    }

对我来说,关键是会话cookie在Load Balancer上运行多个实例时没有得到正确处理(直到将最小实例设置为2才发现这个),所以为了让用户能够登录并且保持登录状态,我在AWS上执行了以下操作:

1.  At Services / Elastic Beanstalk / Configuration / Load Balancing 
    a. set Application health check URL: /health
    b. left Session Stickiness: unchecked
2. At Services / EC2 / Load Balancers / Description / Port Configuration:
    For both port 80 (HTTP)  and 443 (HTTPS)
        1. Edit and select 'Enable Application Generated Cookie Stickiness'
        2. Cookie Name: JSESSIONID

答案 1 :(得分:4)

我刚刚经历了同样的情景。卡在https上,然后重定向,现在一切都很顺利。使用这些Config.groovy设置:

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'

对于那些没有使用springsecurity 2.0的人来说,它是'plugins'而不是没有's'的'plugin'。

我的beanstalk负载均衡器设置如下所示(我安装了SSL证书,我没有显示):

enter image description here

在EC2负载均衡器设置中,确保您的听众设置正确:

enter image description here

最后在EC2安全组中确保EB接受来自ELB的端口80和443上的请求:

enter image description here

请注意,在我的任何设置中,我都没有引用端口8080或8443,即使这是我在本地主机上用于测试的内容。阅读此内容的人可能会考虑尝试使用这些端口来解决问题。我的设置不需要。

答案 2 :(得分:1)

我在类似的环境中面临类似的问题,前端是在https上,防火墙后面的grails服务器在http上。 当会话超时时,ajax和angular $ http用于获取重定向消息到http://myclient.com/myWar/login/auth。此重定向请求用于在浏览器中导致访问被拒绝,因为原始网址为https且已禁用混合内容。 我以前得到SCRIPT7002:XMLHttpRequest:网络错误0x80700013,由于错误80700013无法完成操作。“ 此错误仅在生产中发生,而不在测试环境中发生。

修复很简单,只需将以下内容添加到配置文件即可。 grails.serverURL =“https://mywebsitespublicaddress.com/myWar