Django Auditlog 中间件配置失效的解决方案

7次阅读

Django Auditlog 中间件配置失效的解决方案

django 使用 django-auditlog 时,若 `auditlogmiddleware` 位置不当(如位于 `sessionmiddleware` 或 `authenticationmiddleware` 之前),将无法正确捕获当前登录用户作为 actor_id,导致审计日志中 actor 字段为空。本文详解中间件正确顺序及配置要点。

django 中,auditlog.middleware.AuditlogMiddleware 的核心职责是:在请求处理过程中自动提取当前已认证用户的 request.user,并将其 ID 绑定到后续模型变更的审计日志中(即 actor_id)。但该中间件高度依赖前置中间件提供的上下文——尤其是 sessionMiddleware(管理会话状态)和 AuthenticationMiddleware(将 request.user 注入请求对象)。若 AuditlogMiddleware 被置于它们之前,request.user 尚未被设置,自然无法获取 actor 信息。

因此,正确的中间件顺序必须满足以下依赖链:

  • SessionMiddleware → 提供会话支持;
  • AuthenticationMiddleware → 基于会话识别用户,设置 request.user;
  • AuditlogMiddleware → 必须紧随其后(或至少在其之后),才能读取有效的 request.user;
  • 其他中间件(如 CommonMiddleware、CsrfViewMiddleware 等)可按需安排,但不得破坏上述依赖。

你当前的配置中,AuditlogMiddleware 位于 SessionMiddleware 之后、AuthenticationMiddleware 之前,这是关键错误

MIDDLEWARE = [     'django.middleware.security.SecurityMiddleware',     'django.contrib.sessions.middleware.SessionMiddleware',     'auditlog.middleware.AuditlogMiddleware',  # ❌ 错误:此时 request.user 还未被设置!     'django.middleware.common.CommonMiddleware',     'django.middleware.csrf.CsrfViewMiddleware',     'corsheaders.middleware.CorsMiddleware',     # ⚠️ 注意:CORS 中间件也应置于 CommonMiddleware 之前     'django.contrib.auth.middleware.AuthenticationMiddleware',  # ✅ 此处才设置 request.user     'django.contrib.messages.middleware.MessageMiddleware',     'django.middleware.clickjacking.XFrameOptionsMiddleware', ]

修正后的推荐顺序如下(已标注关键依赖)

MIDDLEWARE = [     'django.middleware.security.SecurityMiddleware',     'django.contrib.sessions.middleware.SessionMiddleware',     'corsheaders.middleware.CorsMiddleware',  # ✅ CORS 必须在 CommonMiddleware 之前(官方要求)     'django.middleware.common.CommonMiddleware',     'django.middleware.csrf.CsrfViewMiddleware',     'django.contrib.auth.middleware.AuthenticationMiddleware',  # ✅ 设置 request.user     'auditlog.middleware.AuditlogMiddleware',                    # ✅ 紧随其后,确保可读取 user     'django.contrib.messages.middleware.MessageMiddleware',     'django.middleware.clickjacking.XFrameOptionsMiddleware', ]

? 注意事项

  • AuditlogMiddleware 不可放在 AuthenticationMiddleware 之前,否则 request.user 为 AnonymousUser 或 None,actor_id 将写入 None;
  • 若使用 django-cors-headers,其 CorsMiddleware 必须位于 CommonMiddleware 之前(见 官方文档),否则跨域头可能不生效;
  • 确保用户已登录(即 request.user.is_authenticated 为 True),未登录用户的 actor_id 默认为 None(可通过 AUDITLOG_DISABLE_ON_ANONYMOUS_USER = False 强制记录,但需谨慎);
  • 修改中间件后,务必重启 Django 开发服务器(runserver)使配置生效;
  • 可通过调试确认:在视图中打印 request.user 和 request.user.pk,验证是否正常;也可在审计日志表(auditlog_logentry)中检查 actor_id 字段是否填充。

完成上述调整后,所有通过 Django Admin、视图或 ORM(如 save())触发的模型变更,都将自动记录操作人 ID,AUDITLOG_INCLUDE_ALL_MODELS = True 也将按预期工作。

text=ZqhQzanResources