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

因为 @vimac 的答案没有解决最近一小时问题,以下仅提供个思路,细节还可以完善

// 存储失败次数时间戳

$key = "user:{$user_id}:login_failed";

$login_failed = $mem->get($key) or array();

$allow_times = 12;

if(! checkAllowTimes($login_failed, $allow_times)){

throw new Exception("allow times max", 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);

// ...

}

function passValid($user_id, $password){

// ...

// 伪代码

return true or false;

}

function checkAllowTimes($login_failed, $allow_times){

$last_hour = strtotime('1 hours ago');

for($i = 0; $i < count($login_failed); $i++){

// 如果已经登录失败 12 次

if($i >= $allow_times - 1){

return false;

}

// 1 小时前的登录记录不检索

if($login_failed[$i] <= $last_hour){

return true;

}

}

return true;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值