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

94 lines
2.6 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?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,7,8',
'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) {
// return SmsLogic::getError();
}
return true;
}
}