您好,我正在開發一個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條評論:)
快樂編碼!
嘗試使用'@ Transactional'和'@ Repository'註釋您的dao圖層。 – Jebil
我已經在負責登錄的DAO類中有'@ Repository'。我做**不**有'@ Transactional' ..你是說我應該註釋DAO類,這是可以更新數據庫表可以重複使用嗎?這是一個有5-6個方法的課程.. 對不起,如果我的問題聽起來很愚蠢,但我對所有在網上閱讀的人都感到困惑,而且我真的不知道我用過的東西是不是真的被釘住了..我的意思是'SecurityContextHolder.getContext()。setAuthentication(null);'和所有這些東西 – Hawk
登錄和更新用戶信息在不同的DAO上。 – Hawk