随书笔记之一分钟内连续登录超过3次就锁定账号

奥奥,这属于看书随笔,之前去面试有面试官问我这个问题:

一分钟内登录超过3次就锁定账号。

当时考虑的动数据库,有一个登录失败历史表,字段有:用户1,登录时间12:00,失败次数1

每次登录失败的时候,查询在本次登录时间1分钟前的登录失败记录,如果没有就记录当前登录时间,用户id,失败次数初始化为1到数据库

如果有失败记录,就查询出来,对失败次数做累加,当发现累加后失败次数为4了,就锁定账号。

嗯嗯,其实这样在大用户下会有大量不可研究性的登录失败历史数据,没啥用,而且在遭受攻击的时候,也会频繁的查询,更新数据库,容易造成数据库宕机,系统不可用。

因此,目前考虑的是:

增加一个reidis键值对,key是用户的id,并对键的过期时间设置为60秒,当用户登录失败的时候就对键值对加1,当键值对的值超过3后就锁定账号

因为是连续登录,所以在用户登录成功时,不管过期不过期,都需要删除key,避免维护另一张无用表,并且避免了频繁更新这个无用表。

这上面的思路是看到接口限流所想到的。

lua脚本部分如下:

local key = KEYS[1]
local limit = tonumber(ARGV[1])
local current = tonumber(redis.call('get',key) or "0")
if(current + 1 > limit)
then
return 0
else
redis.call("incr",key)
--redis.call("expire",key,"5")
return 1
end
执行方式如下:注意空格和逗号
/redis-cli -p 7009 --eval /Users/yp-tc-m-7129/Desktop/aa.lua key , 5


猜你喜欢

转载自blog.csdn.net/zhangxiaomin1992/article/details/77942241