Spring Security 修改密码后 在线用户列表中用户重复

项目中使用 Spring Security 3.2.0 RELEASE 做访问控制,采用单点登录的方式,即第一次登录后使用相同账号再次登录将第一次的登录挤掉。用户主动修改密码时,修改成功后自动退出需要重新登录。

但是在修改密码并重新登录后,使用sessionRegistry.getAllPrincipals()获得所有在线用户,列表中出现重复用户名。

谷歌了半天,原因可能是在修改完密码调用的/j_spring_security_logout退出时,退出的用户对象必须和登录的用户对象是同一个,而我在修改密码时同时修改了SecurityContextHolder中的用户对象的密码,然后再调用退出,这时退出的用户并不是登录的用户,所以退出失败。

解决方法就是在修改前把SecurityContextHolder中的当前用户拿出来clone()一下,然后再用clone()的新的user去保存到数据库,这样退出的时候,SecurityContextHolder里面的用户还是最初登录的用户,所以就没问题了。

暂无评论

发表评论

电子邮件地址不会被公开。 必填项已用*标注

验证码已失效,请刷新验证码