Django 审计日志访问中间件详解
Django 审计日志访问中间件详解
一、中间件概述
AuditLogAccessMiddleware是基于 Django 中间件机制实现的审计日志监控工具,核心功能包括:
- 自动记录审计日志相关视图的访问行为(查看、导出、删除等)
- 精确计算请求处理耗时
- 关联用户、IP、操作类型等上下文信息
- 支持与 Django REST Framework (DRF) ViewSet 无缝集成
二、核心实现代码
# apps/audit_logs/middleware.py
import time
from django.utils.deprecation import MiddlewareMixin
from .models import AuditLogAccess
class AuditLogAccessMiddleware(MiddlewareMixin):
def process_view(self, request, view_func, view_args, view_kwargs):
# 识别审计日志视图并记录开始时间
if hasattr(view_func, 'view_class') and 'AuditLog' in view_func.view_class.__name__:
request._audit_log_start_time = time.time()
request._audit_log_view = view_func.view_class
def process_response(self, request, response):
# 计算耗时并记录访问日志
if hasattr(request, '_audit_log_start_time') and hasattr(request, '_audit_log_view'):
duration = time.time() - request._audit_log_start_time
access_type = self.get_access_type(request, request._audit_log_view)
if access_type:
AuditLogAccess.record_access(
request=request, view=request._audit_log_view,
access_type=access_type, response=response, duration=duration
)
return response
def get_access_type(self, request, view):
# 根据请求方法和视图动作返回操作类型
if request.method == 'GET':
if hasattr(view, 'action'):
if view.action == 'list': return 'LIST'
elif view.action == 'retrieve': return 'DETAIL'
elif view.action == 'export': return 'EXPORT'
return 'SEARCH'
elif request.method == 'DELETE':
return 'DELETE'
return None
三、关键组件解析
1.process_view预处理阶段
- 触发时机:视图函数执行前
- 核心逻辑:
o 通过视图类名(含 "AuditLog")识别目标视图
o 在request对象上绑定自定义属性(_audit_log_start_time记录开始时间,_audit_log_view保存视图类引用)
2.process_response后处理阶段
- 触发时机:视图返回响应后
- 核心逻辑:
o 计算请求耗时(当前时间 - 开始时间)
o 调用get_access_type()确定操作类型
o 通过AuditLogAccess.record_access()持久化日志数据
3.get_access_type操作类型识别
- 基于 RESTful 规范:
o GET +list动作 →LIST(列表查看)
o GET +retrieve动作 →DETAIL(详情查看)
o GET +export动作 →EXPORT(数据导出)
o 其他 GET 请求 →SEARCH(搜索)
o DELETE 请求 →DELETE(删除操作)
四、工作流程
sequenceDiagram
Client->>Middleware: 发起请求
Middleware->>Middleware: process_view()
alt 审计日志视图?
Middleware-->>Middleware: 记录开始时间
end
Middleware->>View: 执行视图逻辑
View->>Database: 业务数据交互
View-->>Middleware: 返回响应
Middleware->>Middleware: process_response()
alt 已标记审计日志请求?
Middleware->>Middleware: 计算耗时 & 识别操作类型
Middleware->>Database: 写入审计日志
end
Middleware-->>Client: 返回响应
五、企业级特性
1. 安全合规:
o 完整记录敏感操作(如删除审计日志),支持追溯审计者行为
o 脱敏存储请求参数,避免敏感数据泄露
2. 性能优化:
o 仅对审计日志视图激活监控,降低全局性能损耗
o 毫秒级耗时计算,支持性能瓶颈分析
3. 扩展性设计:
o 与 DRF ViewSet 动作无缝对接,支持自定义动作扩展
o 日志存储逻辑封装在AuditLogAccess模型中,便于后续扩展字段
六、应用场景
- 安全审计:监控管理员对审计日志的访问行为,满足 GDPR/PCI-DSS 合规要求
- 故障排查:通过请求耗时和响应状态码定位慢查询或异常请求
- 用户行为分析:统计审计日志功能的使用频率和热门操作
该中间件通过 Django 中间件的生命周期钩子,实现了对审计日志系统自身的"元监控",是企业级应用中数据安全与合规审计的关键组件。