2013-04-16 15 views
0

我有一個「雞蛋」問題。 在應用我使用的UserDetailsS​​ervice來獲得用戶(我們不會將用戶信息存儲在我們的數據庫中,我們使用第三方服務真正得到的所有信息)。春天。 Java的。登錄並激活電子郵件

最近我們增加了帳號激活功能。註冊後,我們會向用戶發送激活電子郵件,如果他點擊它,我們會將用戶標記爲ACTIVE並將其重定向到登錄頁面。只有擁有ACTIVE狀態的用戶才能登錄。問題是:我們將從他激活其賬戶的日期開始收取用戶費用,即使他從未登錄。我怎麼能(可能使用spring security)使這些進程(激活和登錄)幾乎同時進行?如果他只是激活了他的賬戶,我們不希望向用戶收費,只有在他已經登錄(激活後)的情況下,我們纔會收取費用。所以我可以以某種方式真正做到這一點:「用戶點擊激活鏈接,然後登錄,然後他的狀態變爲激活(但他只有在激活時才能登錄)」。

很抱歉,如果我的問題的說明不夠清楚

我會感激任何反饋。

謝謝!

回答

0

如果我理解正確的話你的要求,你就需要兩個不同的入口點(登錄頁)到應用程序:

  1. 一個用於激活(首次登錄)的用戶還沒有啓動。
  2. 另一個「正常」一個用於活動用戶。

問題是驗證邏輯需要是上下文敏感的,並且要知道上述哪個頁面啓動了驗證。但是,該框架並非針對這種罕見的用例而設計的,因此身份驗證提供程序不知道實際發送登錄表單的URL。

你需要什麼解決的是根據這些信息以某種方式傳達上下文信息到處理身份驗證請求中的身份驗證提供者(即驗證唯一的非活躍用戶爲url1登錄和驗證纔有效用戶從url2登錄)。可能有數百種不同的方法來實現這一點,一種可能的解決方案是將兩個不同的認證過濾器置於適當的位置,以攔截髮送到兩個不同URL的認證請求。詳細概述如下:

  1. (最好是通過繼承後者)創建現有WebAuthenticationDetailsSourceWebAuthenticationDetails的自己的自定義版本的商店,並公開認證請求的URI。 (這將是在此基礎上在auth提供商可以執行其條件邏輯上下文信息。)
  2. 配置並在過濾器鏈插入UsernamePasswordAuthenticationFilter的兩個不同的實例。分別設置其filterProcessesUrl屬性/j_spring_security_check_active_user/j_spring_security_check_nonactive_user,再加上他們兩人的注入上面創建的自定義AuthenticationDetailsSource
  3. 覆蓋DaoAuthenticationProvider.additionalAuthenticationChecks()在以下列方式的子類:
    • 檢索URI存儲在上面創建WebAuthenticationDetails對象(它是通過authentication.getDetails()訪問)
    • 斷言用戶是活動/非活動根據URI如果asserion失敗,則拋出AccountStatusException
    • 如果斷言成功,請不要忘記委託給超類。
  4. 創建在文章開頭提到的兩種不同的登錄頁面,確保登錄表單張貼憑證各自的URL(/j_spring_security_check_nonactive_user/j_spring_security_check_active_user)。