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

本文探讨了面试中遇到的一分钟内连续登录超过3次即锁定账号的问题。最初方案涉及数据库操作,但考虑到效率和安全性,改用Redis作为解决方案。通过设置Redis键值对,记录用户登录失败次数,超过限制则锁定账号。成功登录时删除键,避免无效数据积累。文中还提及了受接口限流启发的Lua脚本应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

一分钟内登录超过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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值