借助 Rides 实现输入密码错误限制次数
2018-07-06 本文已影响13人
冰镇苏打水
借助 Rides 实现输入密码错误限制次数
-
限制时间为1天(86400s);
-
一小时内错误次数>=6;
key => user_no:AD576dfdcc650e0password_error_count value => 1530862696:1
验证密码前逻辑
function passwordErrorCount($userNo)
{
$redisHost = '127.0.0.1';
$redisProt = 6379;
$redisPwd = 'password';
$redis = new Redis();
$redis->connect($redisHost, $redisProt);
$redis->auth($redisPwd);
$key = 'userNo:' . $userNo . 'password_error_count';
list($time, $count) = explode(':', $redis->get($key));
$ban = $time + 86400;
$result = [
'status' => true,
'message' => "无限制"
];
if (time() <= $ban && $count >= 6) {
$result = [
'status' => false,
'message' => "登录失败", "登录操作被限制,请在" . date('Y-m-d H:i:s', $ban) . "后重试"
];
}
return $result;
}
验证密码
function auth()
{
$user_no = 'U-test';
$pwd = '123456';
$result = passwordErrorCount($user_no);
// 判断是否有登录限制
if($result['status'] === false){
$message = $result['message'];
}elseif ($pwd === '******') {
$message = '登录成功';
}else{
$message = '密码错误';
restrict($user_no);
}
}
输入密码错误后逻辑
function restrict($userNo)
{
$redisHost = '127.0.0.1';
$redisProt = 6379;
$redisPwd = 'password';
$redis = new Redis();
$redis->connect($redisHost, $redisProt);
$redis->auth($redisPwd);
$key = 'userNo:' . $userNo . 'password_error_count';
list($time, $count) = explode(':', $redis->get($key));
// 判断是否在一小时内多次出错
$value = implode(':', array(time(), 1));
if (date('YmdH', $time) === date('YmdH', time())) {
$value = implode(':', array(time(), $count + 1));
}
$redis->set($key, $value);
}
注
-
在写的过程中写了几个if嵌套感觉比较恶心.也不会优化,向有经验的大佬请教略有收获.
-
慢慢锻炼,加强自己的思维.
// 自己写的 // 判断是否有登录限制 if ($result['status'] === true) { // 判断密码是否正确 if ($pwd === '*****') { $message = '登录成功'; } else { $message = '密码错误'; restrict($user_no); } } else { $message = $result['message']; }
// 请教后写的 // 判断是否有登录限制 if($result['status'] === false){ $message = $result['message']; }elseif ($pwd === '******') { $message = '登录成功'; }else{ $message = '密码错误'; restrict($user_no); }
- 没有了嵌套,看起来也清晰了很多
- 因为最后密码失败要调用一个方法,所以
else
很有必要
如果没有调用方法,可以提前赋值:
// 判断是否有登录限制
$message = '密码错误';
if($result['status'] === false){
$message = $result['message'];
}elseif ($pwd === '******') {
$message = '登录成功';
}