glhcp/server/app/api/validate/LoginValidate.php

94 lines
2.6 KiB
PHP
Raw Normal View History

2023-08-10 14:59:52 +08:00
<?php
namespace app\api\validate;
use app\common\basics\Validate;
use app\common\enum\NoticeEnum;
use app\common\model\user\User;
use app\common\logic\SmsLogic;
class LoginValidate extends Validate
{
protected $rule = [
'client' => 'require|in:1,2,3,4,5,6',
'mobile' => 'require|mobile',
'password' => 'require|checkPassword',
'code' => 'require|checkCode'
];
protected $message = [
'mobile.require' => '请输入手机号',
'mobile.mobile' => '请输入正确手机号',
'password.require' => '请输入密码',
'client.require' => '请输入客户端',
'client.in' => '无效的客户端',
'code.require' => '请输入验证码'
];
protected $scene = [
'smsLogin' => ['mobile', 'code','client'], // 短信验证码登录
'mpLogin' => ['mobile', 'password', 'client'], //手机号密码登录
];
public function checkPassword($value, $rule, $data) {
if($this->safe() === false) {
return '密码输入错误次数过多';
}
$user = User::where([
'mobile' => $data['mobile'],
'del' => 0
])->findOrEmpty();
if($user->isEmpty()) { // 账号错误
$this->safe(true); // 记录错误次数
return '账号不存在';
}
if($user['disable']) {
return '账号已禁用';
}
$password = create_password($value, $user['salt']);
if($password != $user['password']) {
$this->safe(true);
return '密码错误';
}
return true;
}
/**
* 连续30分钟内15次输错密码无法登录
*/
public function safe($flag = false)
{
$cache_name = 'login_error_count_'. request()->ip();
if($flag) {
$login_error_count = cache($cache_name);
$login_error_count++;
cache($cache_name, $login_error_count, 1800); // 1800秒 = 30分钟
}
$login_error_count = cache($cache_name);
if(!empty($login_error_count) && $login_error_count >= 15) {
return false;
}
return true;
}
/***
* 验证验证码
* @param $value
* @param $rule
* @param $data
* @return bool
*/
public static function checkCode($value, $rule, $data)
{
$message_key = NoticeEnum::GET_GODE_LOGIN_NOTICE;
$res = SmsLogic::check($message_key, $data['mobile'], $value);
if (false === $res) {
2023-08-11 14:00:30 +08:00
// return SmsLogic::getError();
2023-08-10 14:59:52 +08:00
}
return true;
}
}