LoginValidate.php 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. <?php
  2. namespace app\api\validate;
  3. use app\common\basics\Validate;
  4. use app\common\enum\NoticeEnum;
  5. use app\common\model\user\User;
  6. use app\common\logic\SmsLogic;
  7. class LoginValidate extends Validate
  8. {
  9. protected $rule = [
  10. 'client' => 'require|in:1,2,3,4,5,6',
  11. 'mobile' => 'require|mobile',
  12. 'password' => 'require|checkPassword',
  13. 'code' => 'require|checkCode'
  14. ];
  15. protected $message = [
  16. 'mobile.require' => '请输入手机号',
  17. 'mobile.mobile' => '请输入正确手机号',
  18. 'password.require' => '请输入密码',
  19. 'client.require' => '请输入客户端',
  20. 'client.in' => '无效的客户端',
  21. 'code.require' => '请输入验证码'
  22. ];
  23. protected $scene = [
  24. 'smsLogin' => ['mobile', 'code','client'], // 短信验证码登录
  25. 'mpLogin' => ['mobile', 'password', 'client'], //手机号密码登录
  26. ];
  27. public function checkPassword($value, $rule, $data) {
  28. if($this->safe() === false) {
  29. return '密码输入错误次数过多';
  30. }
  31. $user = User::where([
  32. 'mobile' => $data['mobile'],
  33. 'del' => 0
  34. ])->findOrEmpty();
  35. if($user->isEmpty()) { // 账号错误
  36. $this->safe(true); // 记录错误次数
  37. return '账号不存在';
  38. }
  39. if($user['disable']) {
  40. return '账号已禁用';
  41. }
  42. $password = create_password($value, $user['salt']);
  43. if($password != $user['password']) {
  44. $this->safe(true);
  45. return '密码错误';
  46. }
  47. return true;
  48. }
  49. /**
  50. * 连续30分钟内15次输错密码,无法登录
  51. */
  52. public function safe($flag = false)
  53. {
  54. $cache_name = 'login_error_count_'. request()->ip();
  55. if($flag) {
  56. $login_error_count = cache($cache_name);
  57. $login_error_count++;
  58. cache($cache_name, $login_error_count, 1800); // 1800秒 = 30分钟
  59. }
  60. $login_error_count = cache($cache_name);
  61. if(!empty($login_error_count) && $login_error_count >= 15) {
  62. return false;
  63. }
  64. return true;
  65. }
  66. /***
  67. * 验证验证码
  68. * @param $value
  69. * @param $rule
  70. * @param $data
  71. * @return bool
  72. */
  73. public static function checkCode($value, $rule, $data)
  74. {
  75. $message_key = NoticeEnum::GET_GODE_LOGIN_NOTICE;
  76. $res = SmsLogic::check($message_key, $data['mobile'], $value);
  77. if (false === $res) {
  78. return SmsLogic::getError();
  79. }
  80. return true;
  81. }
  82. }