多系统单点登录存在的问题:
1)怎么区分系统?
可以通过request中User-Agent获取设备信息,判断是否存在系统关键词区分系统;移动端也可以在请求头中添加指定字段确认是什么系统。
2)怎么保证单点?
需要保存已登录的系统的信息和登录时间才能知道当前系统是否已有设备登录
3)怎么形成互斥?
在新设备登录时需要能够获取到就设备的信息,把旧设备信息删除或替换,所有token不可变。
初步方案:
token生成:根据用户使用网站过程中不会改变的信息去生成用户唯一token,用作redis中的key,用户登录时获取登录设备,将登录设备和登录时间用作value保存到redis中。
鉴权:使用拦截器拦截请求,判断有无token。有token则根据token查询redis中所对应的value;获取当前操作设备,判断设备是否已登录(是否在value中),如果存在,判断是否已过期,若没有过期则鉴权通过。
token过期:在保存token时将设备的过期时间一起保存,请求时判断设备登录是否已过期,若没有过期则请求成功,同时更新设备过期时间和redis中token过期时间。
退出登录:判断退出的设备是否存在登录状态,存在则删除设备,设备退出后如果已经没有设备登录,则在redis中删除token。