Spring Security使用旧凭据对用户进行身份验证,直到Web App重新启动

时间:2015-07-20 02:05:34

标签: mysql spring-mvc authentication caching spring-security

您好,我正在开发一个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条评论中了解更多信息:)

快乐的编码!

1 个答案:

答案 0 :(得分:0)

我终于找到了那个问题的根源......黑洞关闭了。积分@Jebil和@Robin Winch的帮助!

一切正常,除了登录DAO的rensposible上的HashMap从未被清除的事实。因此,在每次成功登录尝试后,返回的HashMap都被追加,因此在每次用户名更新后,它都包含旧的和新的值...解决方案很简单..在访问DB HashMap之前应该清除!

快乐除以0:P