您好,我正在开发一个Web应用程序,我正在使用Spring Security。在应用程序中,用户可以更改他/她的详细信息(用户名,密码和其他一些字段)。我正在使用自定义用户详细信息类,我的Spring Security 配置是默认的(请记住,没有声明缓存方法,所以我想 NullUserCache < / strong>被使用)。所有用户记录都来自 DataBase ,使用 JDBC Connector (MySQL)。
现在,当用户更改他/她的信息或/和用户名密码时,这些更改会更新DataBase中的相应列。 现在数据库已更新。因为我没有在自定义用户详细信息类中实现setter,所以我强制用户自动注销。 但现在他/她可以使用新的用户名和旧的登录。
现在假设用户在其他字段上更改了某些内容(例如,如果年龄从20更改为21)。当用户使用新的用户名登录时,我可以看到 21 。如果用户使用旧的用户名登录,我可以看到 20 !。 我猜Spring Security现在创建了一个新用户(在登录期间),该用户不存在,旧用户从未删除!
因此,在阅读了网上的许多帖子并尝试相应的解决方案之后,我仍然无法解决这个问题。
我使用过的(在负责帐户编辑的控制器中):
if (authenticate != null){
new SecurityContextLogoutHandler().logout(request, response, authenticate);
}
SecurityContextHolder.getContext().setAuthentication(null);
SecurityContextHolder.clearContext();
我理解并相信Spring Security在某个地方(我认为用户缓存)拥有用户名,可能还有密码,现在它将旧用户名视为不同的用户。防止这种情况发生的唯一方法是重新启动应用程序。 重新启动后,使用新用户名进行 登录。
有什么方法可以删除“用户” - 用户名?任何建议都是有用的,我真的很困惑,唯一接近我的案例是this,但他的问题是使用连接缓存的oracle连接器..
更新问题跟踪到loadbyusername方法内的问题。在下面的第14条评论中了解更多信息:)
快乐的编码!
答案 0 :(得分:0)
我终于找到了那个问题的根源......黑洞关闭了。积分@Jebil和@Robin Winch的帮助!
一切正常,除了登录DAO的rensposible上的HashMap从未被清除的事实。因此,在每次成功登录尝试后,返回的HashMap都被追加,因此在每次用户名更新后,它都包含旧的和新的值...解决方案很简单..在访问DB HashMap之前应该清除!
快乐除以0:P