之前写过一篇关于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);