您好,我正在开发一个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