2012-03-29 48 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