如何网站增加域名,在线图片编辑器图怪兽,wordpress手动更新视频,如何去推广一个app为防止暴力破解用户账号的行为#xff0c;在输入账号和密码时一般都会限制用户尝试密码输出错误的次数#xff0c;如果用户多次输错密码后#xff0c;将在一段时间内锁定账号#xff0c;常见的有银行类APP、个税App等应用#xff0c;如下是用户账号密码输入错误的提示图在输入账号和密码时一般都会限制用户尝试密码输出错误的次数如果用户多次输错密码后将在一段时间内锁定账号常见的有银行类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的执行效率也很低。3Redis实现方案key加过期时间来实现如果用户登录成功就删除这个key登录失败就在原先登录失败的基础上加1。但为了保证Redis中多个指令执行过程中的原子性可以借助lua脚本来保证原子性。