2015-07-20 60 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

相关问题