当前位置: 首页 > article >正文

统计登录系统10秒内连续登录失败超过3次的用户

为防止暴力破解用户账号的行为,在输入账号和密码时一般都会限制用户尝试密码输出错误的次数,如果用户多次输错密码后,将在一段时间内锁定账号,常见的有银行类APP、个税App等应用,如下是用户账号密码输入错误的提示图:
在这里插入图片描述
如何实现10秒内连续登录失败超过3次的用户呢有以下几种实现方案

1、登录日志表实现方案

每次用户登录的时候,无论登录是否成功与否,我们后端都要记录用户的登录信息到数据表中,如下一张简单的登录日志表:
在这里插入图片描述
日志表中记录用户账号、登录的来源、登录的ip、本次登录是否成功以及登录时间等基本信息。通过日志表我们就可以实现统计10秒内连续登录失败超过3次的用户,如下的流程图
在这里插入图片描述
用户登录的时候,后端需要查询日志表做统计,通过借助Mysql的一个强大的sql窗口函数row_number()来统计连续的10秒内是否存在超过3次的登录失败的情况:

(1)如果存在连续10秒超过3次登录失败,就需要锁定用户的账号并发送一个邮件通知用户。

(2)如果不存在连续10秒超过3次登录失败的情况,返回用户的登录情况(账号密码输入正确,返回登录成功的响应,账号密码输入错误,就返回登录失败的提示)。

    使用日志表实现统计连续10秒超过3次登录失败的用户方案中存在如下的问题:

(a)统计在10秒之内用户超过3次登录失败的用户登录数据,需要使用row_number()窗口函数,一方面统计的sql语句比较复杂,另一方面sql执行的效率也不高。

(b)记录用户的登录日志,随着时间的推移数据量会越来越大,这样会影响性能,后续需要做冷数据的迁移,将指定时间(如1个月前)的用户登录数据迁移到冷表中。

2、Redis实现方案

借助Redis实现统计在10秒之内用户超过3次登录失败的流程图如下所示:
在这里插入图片描述
Redis中以用户id为key(如123_login_record),连续登录失败次数为value,并且设置key的过期时间为10秒。

  用户请求登录时候,服务端检测当前用户输入的账号密码是否正确:(a)如果用户账号密码验证通过(登录成功),此时需要将这个用户Redis中的key删除,目的是用来实现记录连续失败的功能。

(2)如果用户登录失败,那么需要使用setnx命令来设置用户登录失败的信息,并且Redis的key过期时间为10秒,这个过程中如果set失败代表用户之前已经登录失败过,直接把次数加1就可以了。最后我们只需拿到这个用户账号对应的value,判断这个value是否大于等于3,如果大于等3次,那么需要发送登录异常的提示邮件,锁定用户账号一段时间。

总结:

(1)完成统计10秒内连续登录失败超过3次的用户,可以借助登录日志表实现,也可以借助Redis实现方案。

(2)登录日志表实现方案中是借助sql窗口函数row_number()来统计,这种实现方式不但统计的sql复杂,而且随着登录日志表中数据量的增加,sql的执行效率也很低。

(3)Redis实现方案key加过期时间来实现,如果用户登录成功就删除这个key,登录失败就在原先登录失败的基础上加1。但为了保证Redis中多个指令执行过程中的原子性,可以借助lua脚本来保证原子性。

http://www.kler.cn/a/581894.html

相关文章:

  • 计算机三级网络技术备考(5)
  • 每天一道算法题【蓝桥杯】【x的平方根】
  • Kylin麒麟操作系统服务部署 | Ansible基础
  • Axure RP 9 安装与汉化指南(附安装包)包含下载、安装、汉化、授权,Axure9 汉化教程、Axure9 汉化步骤
  • 不用 Tomcat?SpringBoot 项目用啥代替?
  • 智能体开发:推理-行动(ReAct)思维链提示
  • 【2025最新】DeepSeek-R1+Open-WebUI双系统部署全攻略:从Linux到Windows保姆级教程,手把手搭建可视化AI对话平台
  • 从零开始学机器学习——准备和可视化数据
  • springboot 文件下载
  • 带有LBS_OWNERDRAWFIXED 样式的列表框,系统在什么时候向窗口发送WM_DRAWITEM 和WM_MEASUREITEM消息de呢?
  • 使用DeepSeek+蓝耘快速设计网页简易版《我的世界》小游戏
  • 如何在Spring Boot中配置和使用MyBatis-Plus
  • NO.36十六届蓝桥杯备战|位运算和操作符属性|进制转换|原码反码补码|左移|右移|按位与|按位或|按位异或|按位取反(C++)
  • 帕金森病如何 “偷走” 患者的正常生活?
  • HttpMediaTypeNotAcceptableException报错解决,状态码显示为406
  • 3dsmax烘焙光照贴图然后在unity中使用
  • shell脚本一键更新部署docker中服务
  • 《深度学习进阶》第7集:深度实战 通过训练一个智能体玩游戏 来洞察 强化学习(RL)与决策系统
  • 操作系统与网络基础:掌握网络安全的核心技能
  • 基于django+pytorch(Faster R-CNN)的钢材缺陷识别系统