2012-03-29 51 views
2

我有一个grails站点(grails 2.0 with spring security 1.2.6)登录,根据通过URL传入的参数重定向。如何从失败的登录尝试获取url params

例如,如果你去'/'你要去标准'login/auth',但如果你去'/?org=abccorp'你会被重定向到'landing/index'。一旦你登录成功,你将被带到网站的不同部分,基于通过URL和安全角色传入的参数。

到目前为止,我已经能够在有人登录成功的正常情况下正常工作。我的问题来自于如果某人登录失败,spring安全性将重定向到默认的'login/authfail'操作,而无法找到原始URL或参数。

假设有一种方法来获得这些东西,但我发现的一切都已被弃用,移动或根本不存在。

有没有办法得到什么参数最初通过?我可以将它们保存在通话之间或类似的地方吗?

回答

2

authenticationFailureHandler bean使用org.springframework.security.web.RedirectStrategy实例在登录失败时执行重定向。这是默认情况下的一个org.springframework.security.web.DefaultRedirectStrategy实例,并注册为redirectStrategy bean。因此,您可以用您自己的bean替换authenticationFailureHandler bean的redirectStrategy bean。由于您无权访问Authentication,因此替换整个豆似乎不太实际,因此您不知道它是失败还是成功重定向。

为了避免重新定义整个authenticationFailureHandler bean,我只需更改BootStrap.groovy中的bean。它会是这样的(我没有测试此所以它可能是断位)

import com.foo.bar.MyRedirectStrategy 

class BootStrap { 

    def authenticationFailureHandler 

    def init = { servletContext -> 
     authenticationFailureHandler.redirectStrategy = new MyRedirectStrategy() 
    } 
} 

其中MyRedirectStrategyDefaultRedirectStrategy自定义子类(在SRC /常规或SRC/JAVA),它使用请求网址以确定重定向网址。

+0

谢谢!我知道必须有一些我可以延续的课程。为了得到我想要的,我必须将该参数添加到登录表单url('/ j_spring_security_check?foo = blah'),然后将它传递给DefaultRedirectStrategy的子类中的url。 – bressain 2012-03-30 20:14:14