2020-01-15:用户登陆,保存30天的免登,只容许两个设备登陆,若是有第三个设备登陆,踢掉第一个。改密码的时候,全部设备须要下线。这个逻辑怎么实现呢?

福哥答案2020-01-15:
1、我想到的答案。
为何不能用设备id?
接口调用,若是是网页,设备id是没法获取的。另外,设备id能够做假。redis

为何不能用ip区分?
有些网络(某些校园网),对外就是一个ip。服务器

用token区分设备有什么缺点?
同一台设备登陆屡次,会被当成多个不一样的设备。实在想不到好的办法,故逻辑实现采用token区分设备。cookie

逻辑实现以下:
方案1:用redis里的list,key存【用户id】,value存【登陆token】列表。用redis里的string,key存【登陆token】,value存【登陆时间】。30天免登,string中value值是不是30天之前,若是是30天之前,能够删掉string中的这个token,list中对应的token也须要删除。踢掉第1个,当用户数超过两个,踢掉list的第1个token,string中的token也须要删除。改密码,删除某个用户下的list以及string里的对应token。
方案2:用redis里的list,key存【用户id】,value存【登陆token+时间】列表。网络

2、知乎答案:
使用 Redis 存储用户 ,登陆的设备实现,利用 ZSET。
每一个用户一个 ZSET(假设就是以用户 id 做为 ZSET 的 KEY),里面的 KEY 为设备 id,value 为登陆时间戳。
1.当用户登陆时,使用 lua 脚本(防止并发致使登陆设备多于 2 个)检查设备:
ZSCORE 判断设备是否存在以及登陆时间
若是存在:
ZADD就更新SCORE为当前时间戳
若是不存在:
ZCARD 用户id 获取当前用户有多少设备
若是设备数量 >= 2 则移除除了最后一个的其余设备(能够经过ZRANGE获取最后一个KEY,ZSCORE获取其分数以后ZREMRANGEBYSCORE删除小于这个分数的全部KEY)
ZADD设置设备id为KEY,当前时间戳为SCORE
设置ZSET过时时间为30天,减小30天内没有设备登陆时检查登陆态的判断消耗并发

2.当用户请求须要登陆态后的 API,检查登陆态时:
ZSCORE 判断设备是否存在以及登陆时间
若是设备存在存在而且登陆时间与当前时间间隔小于30天,则有效。
不然,登陆态失效,须要从新登陆lua

3.修改密码,全部设备下线:
删除这个ZSETblog

3、享学答案:
1.要可以识别不一样的设备,好比移动设备的imei。
2.服务端须要有存储帐号与设备的记录,以及客户端的ip及端口。
对因而否登出的检测有主动和被动两种方式。
3.服务端主动调用客户端登出。
3.1客户端能够开放清楚客户端cookie等登陆信息的接口。
3.2.服务端在登陆时存入设备与用户的记录,而且判断是否超出限制,若是超出限制则找出最先登陆的客户端ip端口调用清楚客户端cookie的接口。
3.4.修改密码同理,调用全部已登陆客户端的清楚cookie接口。
4.客户端主动检测登陆是否已失效。
4.1服务端须要有检测登陆有效性的接口。
4.2客户端在接到请求时主动调用服务器接口检测,根据响应判断当前登陆状态,若是已失效则主动退出当前帐号。
4.3登陆超出限制或者修改密码时,服务端删除帐号与设备的记录,在客户端调用登陆有效性检测接口时查不到对应设备的记录则返回已失效。token


2020-01-15:用户登陆,保存30天的免登,只容许两个设备登陆,若是有第三个设…如何回答呢?
2020-01-15:用户登陆,保存30天的免登,只容许两个设备登陆,若是有第三个设备登陆,踢掉第一个。改密码的时候,全部设备须要下线。这个逻辑怎么实现呢?
评论接口

相关文章
相关标签/搜索