LoginAccountValidate.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace app\workerapi\validate;
  3. use app\common\cache\MasterWokerAccountSafeCache;
  4. use app\common\enum\LoginEnum;
  5. use app\common\enum\notice\NoticeEnum;
  6. use app\common\enum\user\UserTerminalEnum;
  7. use app\common\enum\YesNoEnum;
  8. use app\common\service\sms\SmsDriver;
  9. use think\facade\Config;
  10. use app\common\model\master_worker\MasterWorker;
  11. use app\common\validate\BaseValidate;
  12. /**
  13. * @author 林海涛
  14. * @date ${DATA}
  15. */
  16. Class LoginAccountValidate extends BaseValidate
  17. {
  18. protected $rule = [
  19. 'account' => 'require',
  20. 'password' => 'require',
  21. 'terminal' => 'require|in:' . UserTerminalEnum::WECHAT_MMP . ',' . UserTerminalEnum::WECHAT_OA . ','
  22. . UserTerminalEnum::H5 . ',' . UserTerminalEnum::PC . ',' . UserTerminalEnum::IOS .
  23. ',' . UserTerminalEnum::ANDROID,
  24. 'scene' => 'require|in:' . LoginEnum::ACCOUNT_PASSWORD . ',' . LoginEnum::MOBILE_CAPTCHA . '|checkConfig',
  25. ];
  26. protected $message = [
  27. 'account.require' => '请输入手机号或账号',
  28. 'password.require' => '请输入密码',
  29. 'terminal.require' => '终端参数缺失',
  30. 'terminal.in' => '终端参数状态值不正确',
  31. 'scene.require' => '场景不能为空',
  32. 'scene.in' => '场景值错误',
  33. ];
  34. /**
  35. * @notes 登录场景相关校验
  36. * @param $scene
  37. * @param $rule
  38. * @param $data
  39. * @return bool|string
  40. * @author 段誉
  41. * @date 2022/9/15 14:37
  42. */
  43. public function checkConfig($scene, $rule, $data)
  44. {
  45. // 账号密码登录
  46. if (LoginEnum::ACCOUNT_PASSWORD == $scene) {
  47. if (!isset($data['password'])) {
  48. return '请输入密码';
  49. }
  50. return $this->checkPassword($data['password'], [], $data);
  51. }
  52. // 手机验证码登录
  53. if (LoginEnum::MOBILE_CAPTCHA == $scene) {
  54. if (!isset($data['code'])) {
  55. return '请输入手机验证码';
  56. }
  57. return $this->checkCode($data['code'], [], $data);
  58. }
  59. return true;
  60. }
  61. /**
  62. * @notes 登录密码校验
  63. * @param $password
  64. * @param $other
  65. * @param $data
  66. * @return bool|string
  67. * @author 段誉
  68. * @date 2022/9/15 14:39
  69. */
  70. public function checkPassword($password, $other, $data)
  71. {
  72. //账号安全机制,连续输错后锁定,防止账号密码暴力破解
  73. $userAccountSafeCache = new MasterWokerAccountSafeCache();
  74. if (!$userAccountSafeCache->isSafe()) {
  75. return '密码连续' . $userAccountSafeCache->count . '次输入错误,请' . $userAccountSafeCache->minute . '分钟后重试';
  76. }
  77. $where = [];
  78. if ($data['scene'] == LoginEnum::ACCOUNT_PASSWORD) {
  79. // 手机号密码登录
  80. $where = ['account|mobile' => $data['account']];
  81. }
  82. $userInfo = MasterWorker::where($where)
  83. ->field(['password,is_disable'])
  84. ->findOrEmpty();
  85. if ($userInfo->isEmpty()) {
  86. return '用户不存在';
  87. }
  88. if ($userInfo['is_disable'] === YesNoEnum::YES) {
  89. return '用户已禁用';
  90. }
  91. if (empty($userInfo['password'])) {
  92. $userAccountSafeCache->record();
  93. return '用户不存在';
  94. }
  95. $passwordSalt = Config::get('project.unique_identification');
  96. if ($userInfo['password'] !== create_password($password, $passwordSalt)) {
  97. $userAccountSafeCache->record();
  98. return '密码错误';
  99. }
  100. $userAccountSafeCache->relieve();
  101. return true;
  102. }
  103. /**
  104. * @notes 校验验证码
  105. * @param $code
  106. * @param $rule
  107. * @param $data
  108. * @return bool|string
  109. * @author Tab
  110. * @date 2021/8/25 15:43
  111. */
  112. public function checkCode($code, $rule, $data)
  113. {
  114. $smsDriver = new SmsDriver();
  115. $result = $smsDriver->verify($data['account'], $code, NoticeEnum::LOGIN_CAPTCHA);
  116. if ($result) {
  117. return true;
  118. }
  119. return '验证码错误';
  120. }
  121. }