Index.php 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. <?php
  2. namespace catchAdmin\login\controller;
  3. use catchAdmin\login\request\LoginRequest;
  4. use catchAdmin\permissions\model\Users;
  5. use catcher\base\CatchController;
  6. use catcher\CatchAuth;
  7. use catcher\CatchResponse;
  8. use catcher\Code;
  9. use catcher\exceptions\LoginFailedException;
  10. use thans\jwt\facade\JWTAuth;
  11. class Index extends CatchController
  12. {
  13. /**
  14. * 登陆
  15. *
  16. * @time 2019年11月28日
  17. * @param LoginRequest $request
  18. * @param CatchAuth $auth
  19. * @return bool|string
  20. */
  21. public function login(LoginRequest $request, CatchAuth $auth)
  22. {
  23. $condition = $request->param();
  24. $need_update=false;
  25. try {
  26. $password = $condition['password'];
  27. if (!preg_match('/^(?=.*[A-Za-z])(?=.*\d)(?=.*[@$!%*#?&])[A-Za-z\d@$!%*#?&]{8,}$/', $password)) {
  28. $need_update=true;
  29. }
  30. $token = $auth->attempt($condition);
  31. $user = $auth->user();
  32. $this->afterLoginSuccess($user, $token);
  33. // 登录事件
  34. $this->loginEvent($user->username);
  35. return CatchResponse::success([
  36. 'token' => $token,
  37. 'user_id' => $user->id,
  38. 'realname'=>$user->username,
  39. 'need_update'=>$need_update,
  40. "phone"=>$user->phone
  41. ], '登录成功');
  42. } catch (\Exception $exception) {
  43. $this->detailWithLoginFailed($exception, $condition);
  44. $code = $exception->getCode();
  45. return CatchResponse::fail($code == Code::USER_FORBIDDEN ?
  46. '该账户已被禁用,请联系管理员' : '登录失败,请检查账号和密码', Code::LOGIN_FAILED);
  47. }
  48. }
  49. /**
  50. * 处理登录失败
  51. *
  52. * @time 2020年10月26日
  53. * @param $exception
  54. * @param $condition
  55. * @return void
  56. */
  57. protected function detailWithLoginFailed($exception, $condition)
  58. {
  59. $message = $exception->getMessage();
  60. if (strpos($message, '|') !== false) {
  61. $username = explode('|', $message)[1];
  62. } else {
  63. $username = $condition['username'];
  64. }
  65. $this->loginEvent($username, false);
  66. }
  67. /**
  68. * 用户登录成功后
  69. *
  70. * @time 2020年09月09日
  71. * @param $user
  72. * @param $token
  73. * @return void
  74. */
  75. protected function afterLoginSuccess($user, $token)
  76. {
  77. $user->last_login_ip = request()->ip();
  78. $user->last_login_time = time();
  79. if ($user->hasField('remember_token')) {
  80. $user->remember_token = $token;
  81. }
  82. $user->save();
  83. }
  84. /**
  85. * 登录事件
  86. *
  87. * @time 2020年09月09日
  88. * @param $name
  89. * @param bool $success
  90. * @return void
  91. */
  92. protected function loginEvent($name, $success = true)
  93. {
  94. $params['login_name'] = $name;
  95. $params['success'] = $success ? 1 : 2;
  96. event('loginLog', $params);
  97. }
  98. /**
  99. * 登出
  100. *
  101. * @time 2019年11月28日
  102. * @return \think\response\Json
  103. */
  104. public function logout(): \think\response\Json
  105. {
  106. return CatchResponse::success();
  107. }
  108. /**
  109. * refresh token
  110. *
  111. * @author JaguarJack
  112. * @email njphper@gmail.com
  113. * @time 2020/5/18
  114. * @return \think\response\Json
  115. */
  116. public function refreshToken()
  117. {
  118. return CatchResponse::success([
  119. 'token' => JWTAuth::refresh()
  120. ]);
  121. }
  122. }