SpringSecurity-日常踩坑,修改session中的用户信息。


之前写过一篇关于SpringSecurity登陆的简单实现,见 https://www.cnblogs.com/ealenxie/p/9293768.html

在实际使用的时候可能会遇到如下场景 : 

遇到场景 : 前端通过session获取当前用户信息,当前用户信息在前端页面发生了改变时(比如用户update了自己的email属性);可能数据库里面已经update了,而程序没有重启或者用户没有重新登陆,则session中的值是不会发生改变的,即验证的用户信息也是不变的,前端显示也并不会更新。

一般spring security在认证后,security会把一个SecurityContextImpl对象存储到session中,此对象中有当前用户的各种资料。

基本思路 : 我们要改变SpringSecurity 的session中用户信息,本质上就是要改SecurityContextImpl对象中的用户信息。

1.  SecurityContextImpl中只有两个基本业务方法,getAuthentication()  / setAuthentication() ,这两个方法是为了获取/设置 Authentication 对象 ,Authentication 是一个接口。

2 . 用户认证最核心的部分是接口 Authentication接口,它有两个最重要的方法 getPrincipal() / setPrincipal(),可获取被验证的用户的身份 / 可用于设置被验证的用户的身份。

3 . Authentication有一个基本的实现类,UsernamePasswordAuthenticationToken,我们只要将它初始化出来,并将我们更新的用户信息赋上去,即可完成修改session的用户信息。

//1.从HttpServletRequest中获取SecurityContextImpl对象
SecurityContextImpl securityContextImpl = (SecurityContextImpl) request.getSession().getAttribute("SPRING_SECURITY_CONTEXT");
//2.从SecurityContextImpl中获取Authentication对象
Authentication authentication = securityContextImpl.getAuthentication();
//3.初始化UsernamePasswordAuthenticationToken实例 ,这里的参数user就是我们要更新的用户信息
UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(user, authentication.getCredentials());
auth.setDetails(authentication.getDetails());
//4.重新设置SecurityContextImpl对象的Authentication
securityContextImpl.setAuthentication(auth);

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM