springboot简版单点登录的实现
项目现状
目前项目状态:
- 访问系服务必须要登录系统,拿到随机token值
- 随机token存储到Redis中(有效期两个小时)
- 前端访问服务,将token 放入heard中,服务判断token在Redis中权限
- 目前基本满足对权限控制的要求
新的需求
要求用户只能在一个地方登陆,多个地方登陆,只让最后一次登陆是有效的(即剔除之前登陆等token)
现存问题
- 账号是唯一的,但是多处登陆,每次登陆的token都是随机
- 用户登录,权限信息虽然都是相同的,但是每个copy的名字(即token都是不一样,不能判断哪个是正统)
解决思路
-
在用户登录时随机生成keyId(随机值或者时间戳)
keyId放入token 中,随权限信息一起存入Redis
-
将keyId放入Redis中
"userId":"KeyId"
userId是用户主键
这里是重点:用户登录进来都会更新其Redis中对应的keyId
-
请求服务时,token的校验顺序
- 校验token是否存在
- 拿到token中userId和keyId
- 用上述userId获取Redis中的keyId
- 比较2和3步骤中keyId的值是否一致,不一致说明:用户已经在新的地址登陆了,并删除此次访问的token
- 其他权限或者资源的校验等等