eagleye

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预处理阶段

  • 触发时机:视图函数执行前
  • 核心逻辑

通过视图类名(含 "AuditLog")识别目标视图

request对象上绑定自定义属性(_audit_log_start_time记录开始时间,_audit_log_view保存视图类引用)

2.process_response后处理阶段

  • 触发时机:视图返回响应后
  • 核心逻辑

计算请求耗时(当前时间 - 开始时间)

调用get_access_type()确定操作类型

通过AuditLogAccess.record_access()持久化日志数据

3.get_access_type操作类型识别

  • 基于 RESTful 规范

o GET +list动作 →LIST(列表查看)

o GET +retrieve动作 →DETAIL(详情查看)

o GET +export动作 →EXPORT(数据导出)

其他 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. 扩展性设计

DRF ViewSet 动作无缝对接,支持自定义动作扩展

日志存储逻辑封装在AuditLogAccess模型中,便于后续扩展字段

六、应用场景

  • 安全审计:监控管理员对审计日志的访问行为,满足 GDPR/PCI-DSS 合规要求
  • 故障排查:通过请求耗时和响应状态码定位慢查询或异常请求
  • 用户行为分析:统计审计日志功能的使用频率和热门操作

该中间件通过 Django 中间件的生命周期钩子,实现了对审计日志系统自身的"元监控",是企业级应用中数据安全与合规审计的关键组件。

 

posted on 2025-07-17 08:25  GoGrid  阅读(36)  评论(0)    收藏  举报

导航