如何实现单点登录功能
修改篇幅:如何限制同一账号只能在一处登录?
我们应该如何限制一个账号只能在一处登录?
一、需求分析
如何实现一个账号只能在一个设备上登录,如果另一个设备登录则当前设备就会退出登录功能?
二、单点登录和单设备登录区别
在介绍基本方法,先来小小介绍一下单点登录
和单设备登录
两个概念的区别
单点登录: 在某个时间段内,同一用户只能在一台设备上进行登录,如果其他设备同时登陆的话就会退出注销。
单设备登(SSO): 允许用户使用一组凭证(如用户名和密码)登录到一个系统,然后在多个相关系统中,无需重新登陆受保护的资源(因此二者是两个完全不一样的概念)
三、单设备登录的实现
方式一:使用数据库记录登录态(自我感觉这种方法更加底层化,同时成本相比之下应该会更低一点,但是具体的代码我不会实现)
在用户登录的时候除了账号信息外还可以将该设备的(IP、ID等可以标志该设备的信息)以及时间提取出来作为一个登录时需要验证的信息。
在进行每一步操作的时候都会首先验证登录信息再进行具体操作,同时每次操作的时候除了需要校验账号信息外还需要校验比如当前设备的IP、ID还等信息,只有一致之后才可以登录成功。
如果不匹配,如果出现拒绝登录的情况就会提示有其他用户在其他设备登录了该账号。匹配就会更新时间。
用户主动退出登录或者超出LimitTime没有操作也会自动弹出登录(可以想想学校的教务系统的长时间逗留会直接被强制退出账户的操作例子)
方式二:使用令牌验证机制(学习过redis的话就比较好实现)
- 用户登录时生成token,将账号作为key,token作为value,设置过期时间存入redis;
- 用户访问应用的时候就会被拦截器拦截必须解析token,获得相对应的账号,然后通过账号找到相对应的value,只有value和对应的token是一致的才允许访问;反之则会弹出登录,重新登陆;
- 当另一个用户登录的时候token就会注入到redis中,这样就可以刷新token和redis的过期时间了。