Grails Spring安全性使用https重定向到登录页面

Grails Spring安全性使用https重定向到登录页面,grails,redirect,login,https,spring-security,Grails,Redirect,Login,Https,Spring Security,我有一个Grails应用程序,使用Spring Security Core在AWS机器上运行,在负载平衡器后面 负载平衡器解密ssl连接并转发到实例的端口8080,添加适当的X-Forwarded-Proto头 我想任何直接访问安全页面重定向到登录页面使用https 例如,请求应该重定向到 我把它放在config.groovy中: grails.plugin.springsecurity.secureChannel.definition = [ '/login/**': '

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

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

我想任何直接访问安全页面重定向到登录页面使用https

例如,请求应该重定向到

我把它放在config.groovy中:

grails.plugin.springsecurity.secureChannel.definition = [
    '/login/**':        'REQUIRES_SECURE_CHANNEL'
]
    // 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
但这会导致重定向循环(HTTP代码302)到HTTP登录页()

然后我试着用:

grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.auth.forceHttps = true
但这会导致重定向(HTTP代码302)到HTTP登录页()

  • 问题仅在生产设置中出现(war部署到负载平衡器后面的Tomcat)
  • 如果我在我的loacal dev机器上测试同一个config.groovy,那么重定向到的情况就会很好
  • 我试图为spring security指定一个不同的httpsPort,它同样在我的本地开发机器上工作,但在一直重定向到http的已部署应用程序中它被完全忽略

  • 没有运气潜伏在类似的帖子里,知道吗?

    我只是经历了同样的场景。在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的用户,它是“插件”,而不是没有“s”的“插件”

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

    在EC2负载平衡器设置中,确保侦听器设置正确:

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


    请注意,在我的任何设置中,我从未引用过端口8080或8443,即使这是我在本地主机上用于测试的端口。阅读本文的人可能会考虑尝试使用这些端口来解决问题。我的安装不需要这样做。

    我还在AWS上使用Spring Security Core 2.0-RC4和https和负载平衡器托管Grails应用程序,多亏了(上文)和AWS的Ravi L,我才让它正常工作

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

    grails.plugin.springsecurity.secureChannel.definition = [
        '/login/**':        'REQUIRES_SECURE_CHANNEL'
    ]
    
        // 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
    
    注意:以下内容在SpringSecurityCore2.0-RC4中不需要-它们已经在DefaultSecurityConfig.groovy中

        secureHeaderName = 'X-Forwarded-Proto'
        secureHeaderValue = 'http'
        insecureHeaderName = 'X-Forwarded-Proto'
        insecureHeaderValue = 'https'
    
    我得到了错误的“不健康”读数,因为点击“/”会返回到/login/auth的302重定向,所以我向HomeController(我将其映射到“/health”)添加了一个health()方法,以便AWS点击:

        class HomeController {
            @Secured('IS_AUTHENTICATED_FULLY')
            def index() { }
    
            @Secured('permitAll')
            def health() { render '' }
        }
    
    对我来说,关键是在负载平衡器上运行多个实例时,会话cookie没有得到正确处理(直到将最小实例设置为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
    

    我在类似的环境中遇到了类似的问题,前端是https,防火墙后面的grails服务器是http。 当会话超时时,ajax和angular$http用于将消息重定向到。此重定向请求用于导致浏览器中的访问被拒绝,因为原始url为https,并且禁用了混合内容。 我曾经获取SCRIPT7002:XMLHttpRequest:Network Error 0x80700013,由于错误80700013,无法完成操作。“ 此错误仅在生产环境中发生,而不在测试环境中发生

    修复很简单,只需将以下内容添加到配置文件中即可。
    grails.serverURL=“”

    非常感谢您的帮助,但运气不好!我复制了相同的设置,也将内部端口移到了80,但它总是重定向到http。。。grails.plugin.springsecurity.secureChannel.definition中有什么内容吗?你知道我至少该如何调试它吗?我没有为secureChannel.definition设置值。是否为您的生产环境设置了grails.serverURL?这是破坏我的应用程序的其他原因,但我认为这与设置cloudfront有关。我没有用日志调试它。我会在配置文件中做一个更改并上传一个新的war,然后使用浏览器逐步浏览每个场景,看看有什么坏了。然后我会做一个更改,然后再试一次。您使用的是什么版本的spring security?对于生产,我有:grails.serverURL=“”。我正在使用“:spring security core:2.0-RC2”我的服务器url是http://www.mycompany.com。我不知道http是否会起作用。我也在使用RC2。你没有使用专有网络,是吗?我在专有网络方面遇到了很多麻烦,最终从AWS中删除了所有专有网络。在与AWS支持部门协商了将近一个小时后,我的设置没有必要这样做。