前言

朋友项目遇到一个新需求,找我问解决方案,需求详情:2小时内账号登录失败三次,自动锁定此账号12小时,到时间自动解除锁定,比如7:00第一次登录失败,8:00第二次登录失败,9:05第三次登录失败,虽然是3次失败,但是第一次与第三次时间间隔已经超过2小时,相当于连续2小时内只有两次登录失败,这时候不应该锁定账户。朋友感觉这是一个小需求,没必要在表里面添加字段,或者重新建立一张登录记录表,但是后来想不到具体的解决方案,于是就让我帮忙想一种解决方案~ 我也没做过这种需求,常见的都是:一共登录失败几次后锁定账户,大都是通过在用户表里面添加字段,记录错误时间和失败次数,如果登录失败次数达到指定失败次数后,锁定此账户;于是对于他这种需求我当时考虑的是用Redis解决

一、第一种方案:

验证步骤:

1、登录:根据用户名查询数据库,验证用户名是否存在,不存在直接返回用户名不存在,用户名存在时再验证密码是否正确;
2、第一次用户名存在密码错误时,查询Redis里面有无此key:用户名 这条失败记录;因为是第一次登录,之前肯定没有存失败记录,肯定查询不到记录,就把Redis里面存本次失败记录,其中Redis中采用hash类型,结构是:key :用户名、time1: 本次错误时间 、 time2:上次错误时间、count:失败次数,并设置key的生存时间为2小时,此时是用户第一次登录,设置失败次数为1,time1与time2的时间相同。
3、用户第二次登录先查询Redis失败分类:
(1):每次登录失败的时间都与上次登录失败的time2相比间隔2小时以上–此时第一次登录失败时候Redis里面key的生存时间已经到期,自动销毁,这次虽然是第二次登录,但是相当于初次登录,存入此条失败记录,失败次数为1,下次时间间隔超过2小时的也是这种方式。
(2):第一次与第二次间隔小于2小时,即每次登录失败的时间time1与上次登录失败的time2相比–此时查询Redis里面有第一次记录,time2错误时间保持不变,count +1,重新设置生存时间为2小时
(3):第三次与第二次时间间隔大于2小时,即第三次登录失败的时间-time2>2,time2更新成为time1的值,count保持不变
(四):第四次与第三次时间间隔大于2小时,即第四次登录失败的时间-time2>2,time2更新成为time1的值,count保持不变
(五):第五次与第三次时间间隔小于2小时,即第五次登录失败的时间-time2>2,time2的值保存不变,count+1,此时count=3,设置key的生存时间为12小时即可,这样以后12小时内再请求,在redis里面都会擦回到此Key的记录,返回已经锁定,禁止登录即可,生存时间12小时到期后,自动销毁,才能重新登陆。

测试用例:

在这里插入图片描述

总结

成为一个小胖子,没事摸摸小肚子~

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐