问题描述:用户1在浏览器打开A
标签页登录了a
账号,然后又到B
标签页登录了b
账号,也就是同时登录了两个账号,然后到A
下去操作数据(不刷新页面),结果造成了在A
下修改到了B
的数据,而且两个账号的权限还存在差异
造成原因: 由于是同源页面,新的标签页的用户信息和token
会覆盖
掉前一个标签页的用户信息和token。
解决方法:
前端解决方法:在登陆的时候存储userId+token 作为键存储 token ,但是需要考虑到这个时候用户名:userName
也可能会被覆盖,所以在每次刷新页面之前,把用户名存储到sessionStorage
中去,因为sessionStorage
生命周期为当前窗口
或标签页
,也就是每个标签页中的sessionStorage
互不影响,即使是同源页面
同一浏览器打开两个同源页面引发的bug【@码云 提个小优化】浏览器打开`A`标签页登录了`a`账号,然后又到`B`标签页 - 掘金 (juejin.cn)
线上问题和上述还有一点区别:一个用户是用管理员账户登录的系统,然后未推出用第二个账户在其他系统单点登录了我们的系统,导致单点登录的那个账户权限等同了管理员,造成越权问题。
当时解决问题的方法:因为考虑是上线的项目,有些改动有限制。当时考虑的是在第二个账户登录的时候把第一个账户的登录存入redis的信息删除。通过查找redis的存储的键名规则查询到登录信息,根据请求的uri判断是单点登录的用户,增加一个过滤器在用户存储登录信息到redis前,把之前的redis上一个用户单点的信息去除。并在前端增加一个刷新操作。