Grails 如何在负载平衡器后面强制Spring Security发出https重定向请求

Grails 如何在负载平衡器后面强制Spring Security发出https重定向请求,grails,iframe,spring-security,load-balancing,http-redirect,Grails,Iframe,Spring Security,Load Balancing,Http Redirect,我们目前正在运行Grails的Tomcat实例前面使用AWS ELB->Apache。我们使用Apache将http请求重定向到https请求。在我们的常规站点上,这对我们来说很好。当试图在Chrome上的iframe中嵌入我们的站点时,问题就出现了。Chrome不喜欢https站点重定向到http页面(即使该页面随后重定向到https)。发生这种情况的原因是,对于Spring Security来说,我们似乎在http上,因为我们在负载平衡器后面。以下是开发者工具提供的网络乒乓球: 在Chro

我们目前正在运行Grails的Tomcat实例前面使用AWS ELB->Apache。我们使用Apache将http请求重定向到https请求。在我们的常规站点上,这对我们来说很好。当试图在Chrome上的iframe中嵌入我们的站点时,问题就出现了。Chrome不喜欢https站点重定向到http页面(即使该页面随后重定向到https)。发生这种情况的原因是,对于Spring Security来说,我们似乎在http上,因为我们在负载平衡器后面。以下是开发者工具提供的网络乒乓球:

在Chrome的iframe中放置相同的页面时,问题就出在这里

我们已经找到了许多解决方案,允许SpringSecurityGrails插件将http请求重定向到特定URL模式的https请求。这是其中的两个例子。我们已经通过让Apache拦截http请求并重定向到https解决了这个问题

问题是Chrome甚至不会在iframe中发出http请求。我们需要能够告诉Spring Security,即使您收到的是使用http的,我们也需要您在完成身份验证后将其更改为https

我们认为可行的一个解决方案是使用contextRelative而不是绝对URL更改为相对URL,因为ELB代理,Spring Security将绝对URL视为http。这似乎表明了同样的情况,但解决方案也没有改变将contextRelative更改为“true”时生成的URL


我们如何告诉Grails Spring安全插件总是将URL格式化为相对URL,或者强制它们使用https方案,以便我们可以在Chrome的iframe中运行应用程序?

如果您想修改
SavedRequest
,那么您可以实现自己的
SavedRequestAwareAuthenticationSuccessHandler
将在将保存的请求从缓存中取出并强制其为https时覆盖协议。

在覆盖现有代码时,我们基本上看到了两个选项:保存URL时更改或重定向时更改。我们已经重写了HttpSessionRequestCache,以便在特定场景下强制将方案保存为https。