2012-02-22 90 views
2

問題:Spring Security的Remember-me功能

我們必須實現兩步登錄過程。第一步 - 用戶輸入名稱/密碼並進行身份驗證。第二步 - 用戶可以通過簡單的點擊選擇一個選項來顯示二級選擇屏幕。完成此操作後,用戶最終將被授權進行某些操作。這結束了當前用戶會話的認證/授權過程。

我們在它的標準形式使用Spring Security:第一個登錄界面默認情況下Spring Security的堆棧處理,只要用戶是 - 春認爲完成登錄過程。

輔選擇屏幕是完全的Spring Security的外面,我們都在用戶選擇時做的是設置正確配置的對象返回到安全上下文。如預期的那樣,這適用於當前會話。

我們確實記得,我的功能,以及它在第一次登錄屏幕通過一個名爲_spring_security_remember_me複選框實現,也是一個重寫的UserDetailsS​​ervice豆。

只要沒有第二選擇屏幕選項,記住我就可以正常工作。由於輔助屏幕與Spring Security無關,因此記憶機制不會被激活用於輔助選項,並且它只能記住第一個登錄步驟。這導致必須要求記住的用戶選擇,我們的任務是避免這種情況。

將登錄表單和輔助選擇放在同一頁面上不是一個選項。

是否需要二次選擇,並基於該cookie我們可以使用更多的cookie的身份驗證時,「默默」傳遞所需的參數。但是這意味着我們不得不做一些Spring Security「應該」提供的手動內容,同時這也會在Spring管理的安全性和記憶功能之外提供一些安全邏輯和標記。

因此,這裏的問題安全大師:如何「逼」記住,我的功能來接受二次呈現選項?如果Remember-Me過濾器可以「檢查」傳遞的URL並確定選擇了記住我選項,我們可以添加此參數。但這聽起來不像是可能的。

在輔助屏幕上使用另一個登錄表單是否可行/可行,並且「靜靜地」只需要傳遞其他參數?在這種情況下,我知道我們不會包含用戶名/密碼,至少不是清晰的形式。這個選項聽起來像是可以完成的,但我仍然相信可能有更簡單的方法來強制記住我做它做的事情。或者在那裏?

感謝, 尼古拉

回答

0

你可以存儲在數據庫中的每個用戶最後選擇的選項。然後你實現一個AuthenticationSuccessHandler,它從數據庫讀取存儲的選項並將其設置在安全上下文中。如果沒有找到該選項,用戶將被重定向到選擇屏幕。

這應該不分身份驗證類型(形式,基本或記住 - 定)的工作,只有當你使用Spring安全3.1或更高版本,以註冊一個AuthenticationSuccessHandler已經出臺in that version的可能性。春季論壇有一個discussion on this topic

+0

感謝您的建議,但它看起來比我們的數據庫設計應該更復雜。我通過在登錄本身嵌入用戶名和額外參數來實現這一點,以便RememberMe已經將所有值包含在一個令牌中 - 這是目標。面臨的挑戰是找出「第二」登錄表單實際觸發內置登錄。第二個登錄表單實際上只有隱藏參數,並且是由JavaScript操作的(即用戶不會得知hi再次登錄的線索 - 他只是選擇該附加值)。 – Nikolay 2012-03-12 18:35:52

+0

我不明白你爲什麼需要考慮第二個屏幕的submissal實際登錄。 「登錄」與已通過身份驗證的用戶建立可信會話。其他的一切其實都是用戶會話的屬性,而不是認證上下文。你不能認爲這第二個選擇作爲一個簡單的用戶配置值得到保存嗎?另外,我不能按照你的假設,這會使你的數據庫設計複雜化:它是一個簡單的表,有三列:用戶名,密鑰和值。 – 2012-03-14 01:08:20