2012-12-12 48 views
2

以下是該場景。我有兩個對象Users(帶有用戶名/密碼)和UserInfo以及與用戶有關的其餘數據。 Users是一張有成千上萬條記錄的舊錶,UserInfo是相當新的。我想盡可能多的UserInfo,因爲我可以當用戶第一次登錄。Grails Spring Security在成功驗證後強制用戶進入特定屏幕

我想在第一次登錄後強制用戶到自定義屏幕並要求UserInfo數據。一旦我在新屏幕中獲得「所需」數據,我不會顯示它,直到用戶自願想要填寫「配置文件」下的數據爲止。

由於有多個入口點到應用程序,我不想更新所有的控制器來檢查這一點。

有沒有辦法可以使用Spring Security filter或者什麼東西在成功登錄時執行?我看了一下ApplicationListener<AuthenticationSuccessEvent>,但它並不能解決問題,就好像我將鏈接粘貼到瀏覽器中一樣,它可以讓我在不詢問「額外信息」的情況下繼續前往目的地。

簡而言之,我想在每次登錄後進行檢查,如果失敗,用戶不允許進入應用程序。無論他怎麼努力,以獲得

+3

您可以與常規的Grails過濾器來做到這一點,說明如下:http://grails.org/doc/latest/guide/theWebLayer.html#filters –

回答

1

在你Config.groovy,配置Spring Security的defaultTargetUrl並告訴它總是重定向有:

grails.plugins.springsecurity.successHandler.alwaysUseDefault = true 
grails.plugins.springsecurity.successHandler.defaultTargetUrl = '/userInfo/edit' 

在你UserInfoController的編輯操作,您可以檢查所需的字段存在(userInfo.validate()也許?),如果它們是,重定向到任何你喜歡的地方,也許'/',否則渲染編輯信息視圖。

+0

了一個過濾器,這樣做的好處是它只會在登錄時執行,而不是查看任何頁面。 – doelleri

+0

偉大的做法@doelleri。但是,如果用戶嘗試粘貼網址,他可以繞過這一步嗎? –

+0

啊......好點,我忘記了他們登錄後,他們將能夠通過URL操作進入任何頁面。所以是的,你需要一個過濾器來防止這種情況。 – doelleri

0

可以採用@doelleri建議的內容,並通過這些措施提高了規則:

  1. 運行批處理任務分配一個臨時ROLE_DISABLED作用,誰不提供補充信息,但每個用戶。如果用戶已經有一些角色,請將其保存在某個屬性中。

  2. 設置您的授權規則,因爲具有ROLE_DISABLED角色的用戶只能訪問/ userInfo/edit。

  3. 在/ userInfo/edit中,如果用戶具有ROLE_DISABLED角色,則呈現信息輸入視圖並在成功更新其信息後恢復用戶的角色。否則重定向到'/'或它請求的路徑。

相關問題