import jwt from django.http import JsonResponse from EduSystemServer.settings import TOKEN_KEY from EduSystemServer.utils import ResponseUtil from Eduadmin.models import Admin from Student.models import Student from teacher.models import Teacher class JWTMiddleware: """ JWT中间件,验证用户是否登录 """ def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 检查请求的路径是否是登录路由,如果是,放行 if request.path == '/login' \ or request.path == "/index" \ or request.path == "/" \ or request.path.startswith("/admin")\ or request.path.startswith("/static"): response = self.get_response(request) return response # 从请求头中获取 Token token = request.META.get('HTTP_AUTHORIZATION', '') try: # 验证 Token payload = jwt.decode(token, TOKEN_KEY, algorithms=['HS256']) # 将解码后的 Token 数据存储在 request 中,以便视图可以访问 if payload.get("type") == "student": if not Student.objects.filter(username=payload.get("username")).exists(): return JsonResponse(ResponseUtil.error("错误信息!"), status=401) if payload.get("type") == "teacher": if not Teacher.objects.filter(username=payload.get("username")).exists(): return JsonResponse(ResponseUtil.error("错误信息!"), status=401) if payload.get("type") == "admin": if not Admin.objects.filter(username=payload.get("username")).exists(): return JsonResponse(ResponseUtil.error("错误信息!"), status=401) request.jwt_payload = payload except jwt.ExpiredSignatureError: return JsonResponse(ResponseUtil.error("登录失效!"), status=401) except jwt.DecodeError: return JsonResponse(ResponseUtil.error("登录失效!"), status=401) # 继续处理请求 response = self.get_response(request) return response