Django中如何对传入请求的Authorization HTTP Header做简单校验?
要对所有传入Django服务的请求做统一的Authorization头校验,最常用的是自定义中间件的方案,仅部分视图需要校验的场景可以用装饰器实现:
方案1:自定义中间件(全局校验推荐)
中间件会拦截所有进入Django的请求,统一做校验逻辑,不需要在每个视图重复写代码:
- 在你的应用目录下新建
middleware.py文件,写入以下代码:
from django.http import JsonResponse from django.conf import settings class AuthorizationCheckMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 跳过不需要校验的路径,比如登录、健康检查接口 if request.path in getattr(settings, "AUTH_EXCLUDE_PATHS", []): return self.get_response(request) # 读取Authorization头 auth_header = request.META.get('HTTP_AUTHORIZATION') if not auth_header: return JsonResponse({"code": 401, "msg": "缺少Authorization头"}, status=401) # 处理标准Bearer格式的头 try: auth_type, token = auth_header.split() if auth_type.lower() != 'bearer': raise ValueError except ValueError: return JsonResponse({"code": 401, "msg": "Authorization头格式错误,需为Bearer <token>"}, status=401) # 自定义校验逻辑,此处以固定token校验为例,可替换为JWT校验、签名校验等逻辑 if token != getattr(settings, "CUSTOM_AUTH_TOKEN", ""): return JsonResponse({"code": 401, "msg": "无效的Authorization凭证"}, status=401) # 校验通过,继续处理请求 return self.get_response(request)
- 在
settings.py中注册中间件并添加配置:
# settings.py MIDDLEWARE = [ # 系统默认中间件放在前面 'django.middleware.security.SecurityMiddleware', 'django.middleware.common.CommonMiddleware', # 注册自定义校验中间件 '你的应用名.middleware.AuthorizationCheckMiddleware', # 其他中间件放在后面 ] # 自定义校验配置,敏感值推荐从环境变量读取 CUSTOM_AUTH_TOKEN = "你的校验凭证" # 免校验路径列表 AUTH_EXCLUDE_PATHS = ["/api/login", "/health"]
方案2:装饰器(仅部分视图需要校验时使用)
如果不需要全接口校验,可以用装饰器给指定视图加校验逻辑:
- 自定义装饰器:
from django.http import JsonResponse from django.conf import settings from functools import wraps def authorization_required(func): @wraps(func) def wrapper(request, *args, **kwargs): auth_header = request.META.get('HTTP_AUTHORIZATION') if not auth_header: return JsonResponse({"code": 401, "msg": "缺少Authorization头"}, status=401) # 校验逻辑和中间件一致,此处省略相同代码 try: auth_type, token = auth_header.split() if auth_type.lower() != 'bearer' or token != settings.CUSTOM_AUTH_TOKEN: return JsonResponse({"code": 401, "msg": "无效的Authorization凭证"}, status=401) except ValueError: return JsonResponse({"code": 401, "msg": "Authorization头格式错误"}, status=401) return func(request, *args, **kwargs) return wrapper
- 给需要校验的视图加装饰器即可:
# FBV用法 @authorization_required def my_view(request): pass # CBV用法 from django.utils.decorators import method_decorator from django.views import View @method_decorator(authorization_required, name='dispatch') class MyView(View): pass
注意事项
- 不要在代码中硬编码校验凭证、密钥等敏感信息,统一放在环境变量或者配置文件中读取
- 如果使用Django REST Framework,可直接使用框架自带的
authentication_classes配置完成校验,无需重复实现 - 校验失败固定返回HTTP 401状态码,符合HTTP协议规范
内容的提问来源于stack exchange,提问作者J maria
相关产品推荐
相关产品推荐

