我在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网址,然后被重定向到HTTPS,因为我在日志中看不到任何问题?
有什么想法吗?
答案 0 :(得分:1)
我发现CloudFoundry + Spring Security目前存在问题,其中HttpServletRequest.isSecure()
在使用https时未返回正确的值。当需要安全通道时,这会使Spring Security在执行无限重定向循环时胜出。
我目睹了一个普通的Spring项目,但这可能是你的grails项目所遭受的。目前的一个解决方法是包装您的HttpServletRequests,以便isSecure()
查看该方案以决定返回什么。
如果您在浏览器中尝试安全URL,您会得到什么(假设应用程序实际已启动,尽管grails插件另有说明)
答案 1 :(得分: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
}
}
}