前期在没有考虑到限制账号不能同时登录多台设备之前,token生成规则就是简单以用户id生成的。
Token续签
目前token失效后的续签是由Redis负责的,实际与JWT无关(只用JWT来生成和销毁token)。
JWT生成token后将其存入Redis中,并设置过期时间为30分钟;增加一个拦截器,每次请求中带着token来到网关时,在拦截器中重置redis中token的过期时间,以此达到续签的效果。
限制多设备登录逻辑
- 在浏览器中关闭操作窗口后,立马重新打开登录页面(token在有效期内),点击登录按钮能够重新进入系统;
- 更换电脑登录,如果token在有效期内,则提示当前账号已在其他设备登录;
调整实现方式
- 将用户id、用户类型、用户登录IP等做为用户信息,使用JWT根据用户信息生成token,对用户信息做一次hash(MD5算法),将hash值作为用户key,token作为值存入Redis;
- 用户进行代理时,系统先根据用户信息做一次hash生成用户key,再根据用户key查询redis里此key是否存在,不存在说明token已失效,则生成新的token进行登录;
- 若存在则token未失效,接下来从token中解析出IP地址,与当前请求中的IP进行对比1,若一致则认为是来自同一台设备上的操作,否则则认为是用户切换其他设备上进行登录,提示用户已在其他设备登录。
此处有个问题是同一个网关出口获取到的IP是相同的。 ↩︎