Grails Spring Security正在重定向到生产服务器上的本地主机

Grails Spring Security正在重定向到生产服务器上的本地主机,grails,spring-security,Grails,Spring Security,我有一个安装了SpringSecurityCore插件的grails应用程序。当地一切正常。我部署到一个临时服务器上,一切正常。我部署到了我们的生产服务器,它是我们的暂存服务器的镜像。我可以很好地访问未受保护的页面。但当SpringSecurity启动并尝试执行它的重定向时,它会重定向到localhost,而不是grails.serverURL 我将尽可能地提高日志记录率,并重新部署,看看我是否能了解任何事情。我会把我的发现贴在这里。如果有人以前有过这种经历,并且知道会发生什么,请告诉我。此外,

我有一个安装了SpringSecurityCore插件的grails应用程序。当地一切正常。我部署到一个临时服务器上,一切正常。我部署到了我们的生产服务器,它是我们的暂存服务器的镜像。我可以很好地访问未受保护的页面。但当SpringSecurity启动并尝试执行它的重定向时,它会重定向到localhost,而不是grails.serverURL

我将尽可能地提高日志记录率,并重新部署,看看我是否能了解任何事情。我会把我的发现贴在这里。如果有人以前有过这种经历,并且知道会发生什么,请告诉我。此外,如果需要查看任何配置文件,我也可以提供这些文件。谢谢

更新 我在底部Config.groovy中添加了以下内容

grails.plugins.springsecurity.useSecurityEventListener = true

grails.plugins.springsecurity.onAuthorizationEvent = { e, appCtx ->
   println "here"
   println e
}

在本地,当我尝试访问一个受保护的页面时,该闭包被命中2次。一次用于初始url。第二次用于验证url。将此部署到我们的生产服务器,我什么也没有得到。

重定向是在
org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint.commerce()
中完成的,因此,如果您能够借用其中一台生产服务器进行调试,您可以在那里设置断点

它基于登录表单uri(例如/login/auth)构建重定向URL,但它使用
request.getServerName()
,因此它应该与原始请求相同。请注意,
grails.serverURL
在这里没有影响,因为它使用请求的服务器名称、端口、上下文等构建URL

在servlet容器前面放置Apache或负载平衡器可能会影响它,尽管我已经完成了这两项工作,并且工作正常


您是否在
resources.groovy
中进行过可能会影响此操作的bean自定义?

如果您的应用程序服务器位于web服务器后面,则此问题可能是由web服务器配置引起的。我遇到了同样的问题,并通过在httpd.conf或apache2.conf中使用以下条目进行了更正。这是

…这里的样板配置

################################
#开始yourdomain.com#
################################
代理请求关闭
代理主机
命令拒绝,允许
通融
ProxyPass/http://localhost:28080/
ProxyPassReverse/http://localhost:28080/
命令允许,拒绝
通融
################################
# ... 结束yourdomain.com#
################################

假设您在Tomcat前面有一个Web服务器(apache、nginx等)作为代理(并且您正在使用Tomcat)

在同时允许http和https的设置中,向tomcat的conf/server.xml文件添加一个单独的连接器元素:

<Connector port="8081" protocol="HTTP/1.1" 
           connectionTimeout="20000" 
           redirectPort="8443"  URIEncoding="UTF-8"
           scheme="https" secure="true" proxyName="somehostname.domain" proxyPort="443" />

如果只允许https,则可以向现有连接器元素添加scheme、secure、proxyName和proxyPort属性

在apache配置中,将*:443虚拟主机代理设置为具有额外属性的连接器。普通http*:80可以连接到原始连接器

有关更多信息:
http://tomcat.apache.org/tomcat-7.0-doc/proxy-howto.html

我知道这是一个老问题,但我想添加我的发现,以帮助其他可能遇到此问题的用户

除了Burt的回答(我假设您使用的是tomcat),我还发现request.getServerName()的返回值也可以通过server.xml进行设置

<Connector protocol="HTTP/1.1"
           port="8080" ...
proxyName="localhost"/>
i、 tomcat 8中的e

在server.xml中包含此行

<Connector protocol="HTTP/1.1"
           port="8080" ...
proxyName="localhost"/>


调用getServername时将返回“localhost”。

SecurityConfig.groovy中是否有可能指向localhost的内容?spring security core中没有SecurityConfig.groovy。它使用Config.groovy。所以,没有了。谢谢你,伯特。不,我们的resources.groovy实际上是空的。我们确实有apache和mod_proxy坐在前面。对我来说,最大的困惑是,为什么它会在一台服务器上工作,而不是在另一台服务器上工作,而这两台服务器的配置方式完全相同,除了通过DNS映射到它的域。我将此答案标记为正确的,以解决我在该请求中的问题。getServerName()确实返回了localhost,这是不正确的。因此,我只需要找出发生这种情况的原因。在我的例子中,它在nginx中配置错误,它丢失了:proxy\u set\u header Host$Host;哦,我的上帝,这解决了我将近三天的关于重定向到localhost的调查,非常感谢!)