2015-07-20 59 views
0

您好,我正在開發一個Web應用程序,並且正在使用Spring Security。在應用程序中,用戶可以更改他/她的詳細信息(用戶名,密碼和其他字段)。我使用的是自定義的用戶詳細信息類,這和我的春季安全配置是默認(記住沒有緩存方法聲明,所以我想NullUserCache使用)。所有用戶記錄來自數據庫使用JDBC連接器(MySQL)。Spring Security使用舊憑證對用戶進行身份驗證,直到Web應用程序重新啓動

現在,當用戶更改他/她的信息或/和用戶名密碼時,這些更改將更新DataBase中的相​​應列。 所以現在數據庫更新爲。因爲我沒有在自定義用戶詳細信息類中實現setter,所以我強制用戶註銷自動註銷。 現在他/她可以使用登錄新的用戶名和舊的之一。

現在假設用戶改變了其他字段的內容(例如,如果年齡從20更改爲21)。當用戶使用新的用戶名登錄時,我可以看到。如果用戶使用舊的用戶名登錄,我可以看到! 我猜Spring Security現在創建一個新用戶(在登錄時),這個用戶不存在,舊的是永不刪除

因此,在閱讀了很多帖子並嘗試相應的解決方案後,我仍然無法解決這個問題。

我用什麼(在控制器中,負責賬戶編輯):

if (authenticate != null){ 
     new SecurityContextLogoutHandler().logout(request, response, authenticate); 
    } 
    SecurityContextHolder.getContext().setAuthentication(null); 
    SecurityContextHolder.clearContext(); 

我理解和相信是Spring Security擁有的地方(我想用戶緩存)的用戶名,也許連同密碼,現在它將舊用戶名視爲不同的用戶。防止這種情況發生的唯一方法是重新啓動應用程序。 重新啓動後用戶只有登錄使用新的用戶名。

有什麼辦法可以刪除該「用戶」 - 用戶名?任何的建議是有用的,我真的很迷茫,只能如此貼近我是this但他的問題是與使用連接緩存在Oracle連接器..

UPDATE問題追查到loadbyusername方法中的一個問題..閱讀更多關於下面的第14條評論:)

快樂編碼!

+0

嘗試使用'@ Transactional'和'@ Repository'註釋您的dao圖層。 – Jebil

+0

我已經在負責登錄的DAO類中有'@ Repository'。我做**不**有'@ Transactional' ..你是說我應該註釋DAO類,這是可以更新數據庫表可以重複使用嗎?這是一個有5-6個方法的課程.. 對不起,如果我的問題聽起來很愚蠢,但我對所有在網上閱讀的人都感到困惑,而且我真的不知道我用過的東西是不是真的被釘住了..我的意思是'SecurityContextHolder.getContext()。setAuthentication(null);'和所有這些東西 – Hawk

+0

登錄和更新用戶信息在不同的DAO上。 – Hawk

回答

0

我終於找到了這個問題的根源。黑洞封閉。致謝@Jebil和@Robin絞車的幫助!

那麼一切工作,因爲它應該除了HashMap的登錄DAO可重複使用,從來沒有清除..所以每次成功的登錄嘗試後HashMap返回被附加,所以在每個用戶名更新後,它包含舊的和新的價值觀..解決方案很簡單..在訪問數據庫之前,HashMap應該被清除!

除以0的快樂:P

相關問題