为了账号安全,请及时绑定邮箱和手机立即绑定

用memcache如何做用户登录失败限制?

用memcache如何做用户登录失败限制?

杨__羊羊 2019-04-19 16:30:05
我要限制用户一小时内登陆只能密码输错12次,如果在最近一小时内累计密码错误超过12次就直接不能登录,如何用memcache实现,不用mysql,因为碰到mysql的loginlog表越来越大,之前mysql的实现方式太慢了
查看完整描述

2 回答

?
慕少森

TA贡献2019条经验 获得超9个赞

如果你不需要记录用户登陆的历史详情,只是想要限制登陆次数就非常简单
为每个用户创建一个特别的key(举个例子,user_login_count_${用户ID}
每次登陆的时候拿到用户名,就去memcache去取这个key的value,如果发现其值已经超过12,则在此时报错说明只能尝试12次
如果不存在这个key,那么通过set新建,并把值记为1,expire时间设置为3600秒
如果登录失败,那么对这个key对应的value进行increment的操作,并重新设置超时时间为3600秒
如果登陆成功,则直接清除这个key的内容
                            
查看完整回答
反对 回复 2019-04-19
?
POPMUISE

TA贡献1765条经验 获得超5个赞

因为@vimac的答案没有解决最近一小时问题,以下仅提供个思路,细节还可以完善
//存储失败次数时间戳
$key="user:{$user_id}:login_failed";
$login_failed=$mem->get($key)orarray();
$allow_times=12;
if(!checkAllowTimes($login_failed,$allow_times)){
thrownewException("allowtimesmax",1);
}
if(!passValid($user_id,$password)){
array_unshift($login_failed,time());
//最多存12条记录
if(count($login_failed)>$allow_times){
$login_failed=array_slice($login_failed,0,$allow_times);
}
$mem->set($key,$login_failed,3600);
}else{
//登录成功删除失败记录,取决于是连续失败还是累计失败?
$mem->delete($key);
//...
}
functionpassValid($user_id,$password){
//...
//伪代码
returntrueorfalse;
}
functioncheckAllowTimes($login_failed,$allow_times){
$last_hour=strtotime('1hoursago');
for($i=0;$i//如果已经登录失败12次
if($i>=$allow_times-1){
returnfalse;
}
//1小时前的登录记录不检索
if($login_failed[$i]<=$last_hour){
returntrue;
}
}
returntrue;
}
                            
查看完整回答
反对 回复 2019-04-19
  • 2 回答
  • 0 关注
  • 602 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号