2013-06-20 17 views
13

我發現密碼恢復非常困難,因爲我以前從未做過密碼恢復。使用發送到電子郵件的動態URL實現彈性安全密碼恢復的指南

到目前爲止,我有其中有網絡應用:

春季安全,在密碼正確散列和用戶角色實現,並正常工作。

戰略從計算器研究提示:

  1. 用戶點擊忘記密碼按鈕,在那裏他進入他的電子郵件地址。
  2. 動態鏈接發送到電子郵件地址
  3. 用戶打開電子郵件地址鏈接
  4. 會重定向他的密碼重置頁

什麼不知道:

  • 如何給鏈接動態的本質 - 世代的方法
  • 鏈接有一個超時 - 在這裏發現了一些問題,但通常涉及自定義處理程序或擴展到spring sec完整功能
  • 請求映射方法來響應這樣的動態鏈接
  • 臨時鏈接存儲方法 - 數據庫,會話等?

正如你所看到的,單個問題的列表非常嚴重。所以希望你能夠提供指導資源,以便如何一步一步做到這一點。在Spring Security文檔中,我無法找到這方面的內容,這讓我有點驚訝。謝謝。

我是學生,所以不知道真的是這樣做的行業最佳實踐,特別是在Java環境中,所以我真的希望任何人都能夠提供幫助。

+0

我已經爲這個用例實現了一個JAVA項目。它位於開源的GitHub上。你可以看看:https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows – OhadR

回答

18

這個問題並沒有真正與Spring Security有很大關係。假如你知道用戶數據庫的結構和使用的密碼編碼器,它實際上只是實現一個涉及數據訪問,Web控制器和發送電子郵件的工作流程。該鏈接應該包含一個隨機標記字符串(例如,使用SecureRandom和base64編碼器),它應該存儲在帶有userId和時間戳(用於驗證鏈接有效的窗口)的數據庫中。控制器將簡單地從傳入的請求中提取令牌,使用令牌從數據庫加載數據。它會檢查時間戳,然後將用戶轉發到密碼輸入表單。根據需求,您可能也希望他們回答一些其他安全問題。然後,您將驗證並編碼密碼並將其存儲在與存儲在重置鏈接表中的userId相匹配的帳戶中。運行批處理作業以從數據庫中刪除過期鏈接也是有意義的。

Grails Spring Security UI插件已經有一個forgot password選項,您可以直接使用或用作參考。

+0

偉大,簡單和簡潔。我相信電子郵件地址+時間戳(作爲鹽)散列生成將做鏈接生成的工作?也只是爲了快速參考以響應動態鏈接,我使用類似於:\t @RequestMapping(value =「/ var/{name}」,method = RequestMethod.GET) – Aubergine

+0

在我接受之前請您確認一下嗎? :-) – Aubergine

+0

爲什麼使用散列?無論如何,您仍然需要存儲令牌以驗證它,並且時間戳是可猜測的。如果我知道有人要求重置並知道他們的電子郵件,我可以在適當的窗口中遍歷所有可能的時間戳,直到系統讓我進入。使用隨機字節作爲鏈接令牌,並且使其足夠長,不必擔心它(例如16字節)。 –

5

我已經實現了這種使用情況的Java項目。它位於開源的GitHub上。

有一切的解釋(如果有什麼東西丟失 - 讓我知道...)


看一看:https://github.com/OhadR/Authentication-Flows

這是客戶網絡的應用程序,使用的auth-流動,與所有解釋的自述。它指導你執行: https://github.com/OhadR/oAuth2-sample/tree/master/authentication-flows

+0

這是否足夠穩定以適應生產使用? – Kafkaesque

+0

這是一個很好的問題。簡而言之:是的。請注意,對於生產,每個(通常)都有自己的需求。例如,有些公司需要「祕密問題」機制,我沒有實施。但是這是一個很好的基礎,可以添加任何需要的東西。在README中看看。讓我知道如果有什麼不明確的。是的 - 它是穩定的:-)注意:我已經改變了我的答案中的鏈接。看看.. – OhadR

+0

嗨@OhadR:我指的是你的項目,它對我有用,我收到一個異常:AuthenticationFlowsProcessorImpl - 身份驗證失敗;嵌套的異常是javax.mail.AuthenticationFailedException,UserActionController - 帳戶被鎖定或不存在,我檢查並且用戶數據已插入db –

相關問題