强制 Grails/Weblogic 仅使用 HTTPS 协议进行重定向

leg*_*nia 5 ssl grails weblogic spring-security offloading

我在项目中使用 Grails (2.2.2),并且我的应用程序发出不需要的 http 重定向而不是 https 重定向。

目前,我们在 Oracle Weblogic 前面有一个 F5 负载均衡器。F5 正在从 Weblogic 卸载我们的 SSL。F5仅接受https请求,Weblogic仅接受http请求。

我的 Grails 项目使用 Spring Security 和 Spring Security CAS 插件。

该问题通常发生在成功登录 CAS 时。Grails 似乎总是发出 HTTP 重定向。

我的 serverURL 指定 HTTPS,就像我的所有 CAS 配置变量一样。喜欢

grails.serverURL = "https://example.com/${appName}"
Run Code Online (Sandbox Code Playgroud)

有没有办法强制 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'
Run Code Online (Sandbox Code Playgroud)

另外,该行为似乎可能与 Spring Security/Spring CAS 插件不尊重协议有关

j_spring_security_check 之后发生的重定向似乎总是返回 http 重定向而不是 https 重定向。这会产生一个问题,因为我们不允许 F5 服务器上的 http 请求。IE

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/
Run Code Online (Sandbox Code Playgroud)

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/'
}
Run Code Online (Sandbox Code Playgroud)

leg*_*nia 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]] 
    } 
}
Run Code Online (Sandbox Code Playgroud)