亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

用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 關注
  • 590 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號