2012-09-26 110 views
2

我在Cloud Foundry上部署了一个非常简单的Grails测试应用程序,该应用程序使用spring-security作为登录页面。在Cloud Foundry上部署需要HTTPS的Grails Web应用程序

我想要求对此登录页面进行HTTPS访问,以便密码不以明文形式发送。

我做的第一件事就是使用HTTPS浏览我的测试应用程序,这很好,因此确认Cloud Foundry可以为我的应用程序提供HTTPS请求服务。

接下来,我添加了以下到Config.groovy中要求HTTPS访问我的网页:

grails.plugins.springsecurity.auth.forceHttps = true 

grails.plugins.springsecurity.secureChannel.definition = [ 
     '/': 'REQUIRES_SECURE_CHANNEL' 
] 

现在,当我尝试使用grails cf-update它挂在Trying to start application...

如果,如果我删除的要求部署对于HTTPS它会成功。

我猜测可能是检查应用程序是否已经启动有问题。这是否使用HTTP网址,然后重定向到HTTPS,因为我看不到日志中的任何问题?

任何想法?

回答

1

我发现目前CloudFoundry + Spring Security存在问题,其中HttpServletRequest.isSecure()在使用https时未返回正确的值。这要求Spring Security在需要安全通道时进行无限重定向循环。

我目睹了一个普通的Spring项目,但这可能是您的Grails项目所遭受的。目前的一种解决方法是包装您的HttpServletRequests,以便isSecure()查看该方案以决定返回的内容。

如果试图在浏览器中的安全网址,你怎么弄(假设应用程序实际上已经开始,虽然Grails的插件告诉其他)

+0

我在挂机期间在浏览器中尝试了安全的URL,很遗憾没有得到可能导致我原来的理论失效的回应。 –

+0

ebottard是对的。如果您尝试“grails cf-log”,您会发现该应用程序已经有效地启动了。当你点击url时,像“hitting_url导致了太多重定向”。需要弄清楚cf中有什么问题。 –

+0

是的,同意,现在可以看到“太多重定向消息”。如果我直接转到HTTPS版本的登录网址,它可以正常工作。我应该提出这个错误吗? –

0

的问题是,cloudfoundry terminates HTTPS at the loadbalancer。并且无法将HTTPS一路获取到您的应用,因此'REQUIRES_SECURE_CHANNEL'在cloudfoundry上不起作用。

如果你想要一个严重的黑客来试图检查用户和负载均衡器之间是否使用了HTTPS,你可以看看过滤器中的标题。例如。

sslHeaderRequireFilter(controller:'*', action:'*') { 
     before = { 
      def headerNames = request.headerNames.collect{ it }    
      if(! headerNames.contains('sslclientcertstatus')){ 
       render "Only available on https" 
       return false  
      }     
     } 
    } 
+0

问题不是CF终止在路由器上。问题在于,CF不包含HTTP调用的x-forwarded-proto头,因为它应该是。这是插件正常运行所必需的。 – gregturn

相关问题