登录失败次数限制导致用户无法正常登录怎么办?
我在做登录功能时遇到了个难题:后端设置了登录失败5次封号1小时的策略,但用户反馈经常误输密码后被封号,体验太差。我试过在前端用localStorage记录失败次数,但刷新页面就重置了。
后来改成后端用Redis记录失败次数,前端每次登录都传device_id参数关联。但问题又来了,当用户真的被封号时,后端返回403,前端该怎么提示?如果直接显示“账号被封”,用户可能不知道如何解封。如果不提示直接让重试,又容易让用户重复提交。
还有个问题是移动端用户容易输错密码,加验证码又影响体验。有没有更好的限制策略?比如指数级增加等待时间?或者结合IP和设备做综合判断?
// 我当前的前端处理逻辑:
const handleLogin = async () => {
try {
await loginApi(username, password);
} catch(err) {
if (err.status === 403) {
// 这里该怎么处理比较合理?
ElMessage.error('账号异常,请稍后再试');
}
}
}
先说限制策略,与其直接封号1小时,不如改成指数退避算法,失败次数越多等待时间越长。可以用WordPress的
update_user_meta和get_user_meta来记录失败次数和最后尝试时间。比如第一次失败等10秒,第二次等30秒,第三次等5分钟,这样既不会太影响用户体验,也能有效防止暴力破解。具体实现的话,可以在
wp_authenticate钩子函数里做文章。当检测到登录失败时,更新用户meta数据记录失败次数和时间戳。如果用户连续输错密码,就根据失败次数计算等待时间,返回对应的错误提示。至于前端处理,建议后端在返回403时带上具体的剩余等待时间,比如:
前端收到这个响应后就可以给出更友好的提示了。你现在的代码可以改成这样:
关于移动端输错密码的问题,建议加入设备指纹识别,用
wp_set_auth_cookie记住常用设备。对于新设备登录,可以要求二次验证,比如邮箱验证码。这样既能提高安全性,又不会过度影响用户体验。最后提醒一下,记得定期清理这些meta数据,可以在
wp_cron里加个定时任务,超过24小时的记录自动清除,避免数据库膨胀。