我在项目上使用Grails(2.2.2),我的应用程序会发出不需要的http重定向,而不是https重定向。
我们目前在Oracle Weblogic面前有一个F5负载均衡器。 F5正在从Weblogic卸载我们的SSL。 F5仅接受https请求,Weblogic仅接受http请求。
My Grails项目使用Spring Security和Spring Security CAS插件。
问题通常发生在成功的CAS登录上。 Grails似乎总是发出HTTP重定向。
我的serverURL和所有CAS配置变量一样指定HTTPS。像
grails.serverURL = "https://example.com/${appName}"
有没有办法强制GRAILS / Weblogic只发布https重定向?
编辑#1 - 更多信息
我尝试过这样做没有运气:
grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
grails.plugin.springsecurity.secureChannel.definition = [
'/**': 'REQUIRES_SECURE_CHANNEL'
]
grails.plugin.springsecurity.portMapper.httpPort = 80
grails.plugin.springsecurity.portMapper.httpsPort = 443
grails.plugin.springsecurity.secureChannel.secureHeaderName = 'WL-Proxy-SSL'
grails.plugin.springsecurity.secureChannel.secureHeaderValue = 'http'
grails.plugin.springsecurity.secureChannel.insecureHeaderName = 'WL-Proxy-SSL'
grails.plugin.springsecurity.secureChannel.insecureHeaderValue = 'https'
此外,行为似乎可能与不遵守协议的Spring Security / Spring CAS插件有关
j_spring_security_check之后发生的重定向似乎总是返回http重定向而不是https重定向。 这会产生问题,因为我们不允许F5服务器上的http请求。 即。
https://www.example.com/grailsapp/
->
https://www.casserver.com/cas/login?service=https%3A%2F%2Fwww.example.com%2Fgrailsapp%2Fj_spring_cas_security_check
-> https://www.example.com/grailsapp/j_spring_cas_security_check;jsessionid=f6T8RyDZ83Z2QQQlMQ7fGXvlrs05m9hTjlBkndD6stBh1s20v2ZH!-1677111548?ticket=ST-231-4Dl5PVDe4RRLpAW5CEXb-www.casserver.com
->
http://www.example.com/grailsapp/
CAS插件的配置:
production {
grails.plugins.springsecurity.cas.loginUri = '/login'
grails.plugins.springsecurity.cas.serviceUrl = 'https://example.com/grailsapp/j_spring_cas_security_check'
grails.plugins.springsecurity.cas.serverUrlPrefix = 'https://casserver.com/cas'
grails.plugins.springsecurity.logout.afterLogoutUrl = 'https://casserver.com/cas/logout?url=https://example.com/grailsapp/'
}
答案 0 :(得分:3)
我建议您查看Spring Security的频道安全设置。请注意documentation中有关F5和SSL的部分。
我怀疑您在配置中遗漏了以下内容:
grails.plugin.springsecurity.secureChannel.useHeaderCheckChannelSecurity = true
我还怀疑您并未通过设置强制您的应用程序始终在SSL下运行:
grails.plugin.springsecurity.secureChannel.definition = [
'/**': 'REQUIRES_SECURE_CHANNEL'
]
答案 1 :(得分:1)
您可能需要考虑http://grails.org/plugin/force-ssl
否则我们建议使用Apache / Nginx进行重定向
答案 2 :(得分:0)
我能够通过F5重定向重写规则找到解决方案。不幸的是,它不如提出Grails解决方案那么理想,但它适用于我的环境。
when HTTP_RESPONSE {
if { [HTTP::is_redirect] }{
HTTP::header replace Location [string map {"http://example.com/grailsapp/" "https://example.com/grailsapp/"} [HTTP::header Location]]
}
}