| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103 |
- <?php
- namespace App\Http\Middleware;
- use App\Models\User;
- use Closure;
- use Illuminate\Http\Request;
- use Tymon\JWTAuth\Exceptions\JWTException;
- use Tymon\JWTAuth\Exceptions\TokenExpiredException;
- use Tymon\JWTAuth\Exceptions\TokenInvalidException;
- use Tymon\JWTAuth\Exceptions\TokenBlacklistedException;
- abstract class BaseJwtMiddleware
- {
- public string $platform = '';
- /**
- * 获取守卫名称
- */
- abstract protected function getGuard();
- /**
- * 获取用户模型类名
- */
- abstract protected function getUserModel();
- /**
- * 认证失败的错误信息
- */
- abstract protected function authFailedResponse();
- /**
- * 用户状态检查
- */
- protected function checkUserStatus($user)
- {
- return null; // 子类可以覆盖此方法
- }
- /**
- * Handle an incoming request.
- */
- public function handle(Request $request, Closure $next)
- {
- try {
- // 使用指定的守卫进行认证
- $user = auth($this->getGuard())->authenticate();
- if (!$user) {
- return response()->json([
- 'code' => 401,
- 'message' => '用户不存在',
- 'data' => null
- ]);
- }
- if ($this->platform == 'api') {
- User::where('id', $user->id)->update(['last_active_time' => time()]);
- }
- // 检查用户状态
- if ($statusCheck = $this->checkUserStatus($user)) {
- return $statusCheck;
- }
- // 将用户信息注入到请求中
- $request->merge([
- 'user' => $user,
- 'user_type' => $this->getGuard() === 'admin-api' ? 'admin' : 'user'
- ]);
- } catch (TokenExpiredException $e) {
- return response()->json([
- 'code' => 401,
- 'message' => '登录已过期,请重新登录',
- 'data' => null
- ]);
- } catch (TokenInvalidException $e) {
- return response()->json([
- 'code' => 401,
- 'message' => '登录凭证无效',
- 'data' => null
- ]);
- } catch (TokenBlacklistedException $e) {
- return response()->json([
- 'code' => 401,
- 'message' => '登录凭证已失效',
- 'data' => null
- ]);
- } catch (JWTException $e) {
- return response()->json([
- 'code' => 401,
- 'message' => '请先登录',
- 'data' => null
- ]);
- }
- return $next($request);
- }
- }
|