BaseJwtMiddleware.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. <?php
  2. namespace App\Http\Middleware;
  3. use App\Models\User;
  4. use Closure;
  5. use Illuminate\Http\Request;
  6. use Tymon\JWTAuth\Exceptions\JWTException;
  7. use Tymon\JWTAuth\Exceptions\TokenExpiredException;
  8. use Tymon\JWTAuth\Exceptions\TokenInvalidException;
  9. use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
  10. abstract class BaseJwtMiddleware
  11. {
  12. public string $platform = '';
  13. /**
  14. * 获取守卫名称
  15. */
  16. abstract protected function getGuard();
  17. /**
  18. * 获取用户模型类名
  19. */
  20. abstract protected function getUserModel();
  21. /**
  22. * 认证失败的错误信息
  23. */
  24. abstract protected function authFailedResponse();
  25. /**
  26. * 用户状态检查
  27. */
  28. protected function checkUserStatus($user)
  29. {
  30. return null; // 子类可以覆盖此方法
  31. }
  32. /**
  33. * Handle an incoming request.
  34. */
  35. public function handle(Request $request, Closure $next)
  36. {
  37. try {
  38. // 使用指定的守卫进行认证
  39. $user = auth($this->getGuard())->authenticate();
  40. if (!$user) {
  41. return response()->json([
  42. 'code' => 401,
  43. 'message' => '用户不存在',
  44. 'data' => null
  45. ]);
  46. }
  47. if ($this->platform == 'api') {
  48. User::where('id', $user->id)->update(['last_active_time' => time()]);
  49. }
  50. // 检查用户状态
  51. if ($statusCheck = $this->checkUserStatus($user)) {
  52. return $statusCheck;
  53. }
  54. // 将用户信息注入到请求中
  55. $request->merge([
  56. 'user' => $user,
  57. 'user_type' => $this->getGuard() === 'admin-api' ? 'admin' : 'user'
  58. ]);
  59. } catch (TokenExpiredException $e) {
  60. return response()->json([
  61. 'code' => 401,
  62. 'message' => '登录已过期,请重新登录',
  63. 'data' => null
  64. ]);
  65. } catch (TokenInvalidException $e) {
  66. return response()->json([
  67. 'code' => 401,
  68. 'message' => '登录凭证无效',
  69. 'data' => null
  70. ]);
  71. } catch (TokenBlacklistedException $e) {
  72. return response()->json([
  73. 'code' => 401,
  74. 'message' => '登录凭证已失效',
  75. 'data' => null
  76. ]);
  77. } catch (JWTException $e) {
  78. return response()->json([
  79. 'code' => 401,
  80. 'message' => '请先登录',
  81. 'data' => null
  82. ]);
  83. }
  84. return $next($request);
  85. }
  86. }