2011-01-05 103 views
0

以Spring Security我喜歡這裏描述的DaoAuthenticationProvider春季安全userCache無效

http://static.springsource.org/spring-security/site/docs/2.0.x/reference/dao-provider.html

我也有緩存(也喜歡在那篇文章裏定律描述)。

的問題是,當一個請求具有良好的用戶名進來(即已經在緩存),但錯誤的密碼 - 它返回緩存用戶,如果它是一個很好的用戶名/密碼。因爲它使用用戶名作爲密鑰,所以根本不涉及密碼。

從緩存中返回用戶的確切代碼:

UserDetails user = this.userCache.getUserFromCache(username); 

有沒有人曾經處理這個問題之前?我也可以檢查密碼是否相同,但這是一個自定義的事情。

謝謝。

+0

是否每個請求都發送用戶名和密碼?如果是這樣,我認爲緩存沒有意義。 – Raghuram 2011-01-06 07:46:50

+0

如果您想保存DAO呼叫,這是有道理的。 – 2011-01-06 17:17:15

回答

2

如果您配置了標準組件應用程序,該方案應該如下:

  1. Authentication對象被創建並與用戶提供的用戶名和密碼填入用戶請求到達。

  2. 用戶詳細信息被檢索:如果可能的話,UserCache用於檢索先前高速緩存的用戶的信息(即getUserFromCache被稱爲或者通過的UserDetailsServiceAuthenticationProvider被執行以AuthenticationManager呼叫之前實現)。並且從緩存中的用戶詳細信息將帶有良好的密碼是100%。

  3. 後基本認證前的檢查(憑證到期等)發生實際的認證。此時,來自緩存用戶詳細信息的密碼將與提供的Authentication對象(當前包含錯誤密碼)中存儲的密碼進行比較。此時認證嘗試失敗。

但是,如果實現自己AuthenticationProviderAuthenticationManager,您負責密碼檢查。

+0

最後我不得不自己做密碼檢查,因爲我有一個自定義的AuthenticationProvider。謝謝。 – 2011-01-06 17:18:08

0

什麼是最初從數據庫中獲取用戶和緩存它的代碼?它檢查密碼嗎?聽起來就像你有一個抽象問題 - Spring Security不應該知道用戶來自哪裏(數據庫或緩存),並且應該使用相同的邏輯。

+0

是的,最初獲取密碼並緩存用戶對象(以及密碼)。但是,當下面的請求出現時,Spring會根據用戶名檢查用戶是否被緩存,如果它在緩存中,則認爲用戶名認證成功。那就是問題所在。 – 2011-01-05 21:04:00