2013-12-13 98 views
8

重定向到登录页面我有一个Grails应用程序,使用运行在负载均衡器后面的AWS机器上的Spring Security Core。Grails Spring Security使用https

负载均衡器解密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负载平衡器后面)presentig。
  2. 如果我在我的loacal开发机器上测试相同的config.groovy,重定向到https://myapp.com/login/auth发生得很好。
  3. 我试图指定春季安全不同httpsPort,再次它的工作我的本地开发计算机上,但它是在部署应用程序,不断重定向完全忽略到http

没有运气潜伏在类似的帖子,任何理念?

回答

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,它是“插件”,而不是“插件”,不包括“S”。

我的魔豆负载均衡器的设置是这样的(我已经安装了一个SSL证书,我没有表现出来):

enter image description here

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

enter image description here

终于在EC2安全组确保EB接受从ELB端口80和443请求:

无处在我的任何设置就我所引用的端口8080或8443,尽管这是我在我的本地测试使用

enter image description here

注意。有人阅读此文可能会考虑尝试使用这些端口来解决问题。我的设置不需要。

+0

非常感谢您的帮助,但没有运气!我再现了相同的设置,也将内部端口移动到80,但它总是重定向到http ...你有什么在grails.plugin.springsecurity.secureChannel.definition?任何想法,我怎么能至少调试它? – Paull

+1

我没有为secureChannel.definition设置值。您是否为您的生产环境设置了grails.serverURL?那是破坏我的应用程序的其他内容,但我认为这与设置云端有关。我没有用日志进行调试。我会在配置文件中进行更改并上传新的战争,然后使用浏览器浏览每个场景以查看破坏情况。然后,我会做出改变,然后再试一次。 – spock99

+0

您使用的是什么版本的spring security? – spock99

4

我也在AWS上使用https和负载平衡器来托管我的Spring Security Core 2.0-RC4的Grails应用程序,并且感谢spock99(以上)和AWS的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的核2.0-RC4 - 它们已经在DefaultSecurityConfig.groovy

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

我因为点击'/'返回302重定向到/ login/auth,所以我向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 
1

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

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