【问题标题】:Deploying a Grails web app that requires HTTPS on Cloud Foundry在 Cloud Foundry 上部署需要 HTTPS 的 Grails Web 应用程序
【发布时间】:2012-09-26 13:59:19
【问题描述】:

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

我想为此登录页面要求 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 url,然后由于我在日志中看不到任何问题而被重定向到 HTTPS?

有什么想法吗?

【问题讨论】:

    标签: grails cloud-foundry


    【解决方案1】:

    我发现 CloudFoundry + Spring Security 目前存在一个问题,HttpServletRequest.isSecure() 在使用 https 时没有返回正确的值。这胜过 Spring Security 在需要安全通道时执行无限重定向循环。

    我在一个普通的 Spring 项目中见证了这一点,但这可能是你的 grails 项目所遭受的。目前的一种解决方法是包装您的 HttpServletRequests,以便 isSecure() 查看该方案以决定返回什么。

    如果您在浏览器中尝试使用您的安全 URL,您会得到什么(假设应用程序已实际启动,尽管 grails 插件另有说明)

    【讨论】:

    • 我在挂起期间在浏览器中尝试了安全 URL,但很遗憾没有得到响应,这可能会使我原来的理论无效。
    • 埃博塔尔是对的。如果您尝试“grails cf-log”,您会发现应用程序实际上已启动。当您点击 url 时,类似“hitting_url 导致了太多重定向”之类的内容。需要找出cf中的问题。
    • 是的,同意,可以看到“现在重定向消息太多”。如果我直接转到登录 url 的 HTTPS 版本,它就可以正常工作。我应该将此作为错误提出吗?
    • 是的,您可以在support.cloudfoundry.com 提出票证。使用您的 cloudfoundry 凭据登录。它已通过 cf.com 启用 sso。
    【解决方案2】:

    问题在于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    
                }                   
            }
        }
    

    【讨论】:

    • 问题不在于 CF 在路由器处终止。问题是 CF 没有包含应有的 HTTP 调用的 x-forwarded-proto 标头。这是插件正常运行所必需的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多