'require', 'password' => 'require|password', 'client' => 'require|in:' . Client_::oa . ',' . Client_::ios . ',' . Client_::android. ',' .Client_::pc. ','. Client_::h5. ','. Client_::tt, 'code'=>'require|checkCode', ]; protected $message = [ 'account.require' => '请输入账号或手机号', 'password.require' => '请输入密码', 'password.password' => '密码错误', 'client.in' => '当前只支持h5和app登录', 'code.require'=>'请输入验证码', ]; public function scenePassword() { $this->remove(['code']); } public function sceneCode() { $this->only(['account','code','client']); } public static function checkCode($value,$rule,$data){ $sms_logic = new SmsLogic($data['message_key'],$data['account'],$value); $check = $sms_logic->checkCode(); //检查验证码是否正确 if($check !== true){ return $check; } //标记验证码已验证 $sms_logic->cancelCode(); return true; } /** * 账号密码验证码 * @param $password * @param $other * @param $data * @return bool * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ protected function password($password, $other, $data) { if ($this->safe() === false) { $this->message['password.password'] .= ':多次输入错误'; return false; } $admin_info = Db::name('user') ->where(['account|mobile' => $data['account'], 'del' => 0]) ->find(); if (empty($admin_info)) { $this->safe(true); return false; } if ($admin_info['disable']) { return '账号被禁用'; } $password = create_password($password, $admin_info['salt']); if ($password != $admin_info['password']) { $this->safe(true); return false; } return true; } /** * 连续30分钟内15次输错密码,无法登录 * @param bool $add * @return bool */ protected function safe($add = false) { $cache_name = 'app_login_error_count' . request()->ip(); if ($add) { $admin_login_error_count = Cache::get($cache_name); $admin_login_error_count++; Cache::tag('app_login_error_count')->set($cache_name, $admin_login_error_count, 1800); } $count = Cache::get($cache_name); if (!empty($count) && $count >= 15) { return false; } return true; } }