60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package middleware
 | ||
| 
 | ||
| import (
 | ||
| 	"git.huangwc.com/pig/pig-farm-controller/internal/domain/audit"
 | ||
| 	"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
 | ||
| 	"github.com/labstack/echo/v4"
 | ||
| )
 | ||
| 
 | ||
| // AuditLogMiddleware 创建一个Echo中间件,用于在请求结束后记录用户操作审计日志。
 | ||
| // 它依赖于控制器通过调用 SendSuccessWithAudit 或 SendErrorWithAudit 在上下文中设置的审计信息。
 | ||
| func AuditLogMiddleware(auditService audit.Service) echo.MiddlewareFunc {
 | ||
| 	return func(next echo.HandlerFunc) echo.HandlerFunc {
 | ||
| 		return func(c echo.Context) error {
 | ||
| 			// 首先执行请求链中的后续处理程序(即业务控制器)
 | ||
| 			err := next(c)
 | ||
| 
 | ||
| 			// --- 在这里,请求已经处理完毕 ---
 | ||
| 
 | ||
| 			// 从上下文中尝试获取由控制器设置的业务审计信息
 | ||
| 			actionType, exists := c.Get(models.ContextAuditActionType.String()).(string)
 | ||
| 			if !exists || actionType == "" {
 | ||
| 				// 如果上下文中没有 actionType,说明此接口无需记录审计日志,直接返回
 | ||
| 				return err
 | ||
| 			}
 | ||
| 
 | ||
| 			// 从 Context 中获取用户对象
 | ||
| 			var user *models.User
 | ||
| 			if userCtx := c.Get(models.ContextUserKey.String()); userCtx != nil {
 | ||
| 				user, _ = userCtx.(*models.User)
 | ||
| 			}
 | ||
| 
 | ||
| 			// 构建 RequestContext
 | ||
| 			reqCtx := audit.RequestContext{
 | ||
| 				ClientIP:   c.RealIP(),
 | ||
| 				HTTPPath:   c.Request().URL.Path,
 | ||
| 				HTTPMethod: c.Request().Method,
 | ||
| 			}
 | ||
| 
 | ||
| 			// 直接从上下文中获取所有其他审计信息
 | ||
| 			description, _ := c.Get(models.ContextAuditDescription.String()).(string)
 | ||
| 			targetResource := c.Get(models.ContextAuditTargetResource.String())
 | ||
| 			status, _ := c.Get(models.ContextAuditStatus.String()).(models.AuditStatus)
 | ||
| 			resultDetails, _ := c.Get(models.ContextAuditResultDetails.String()).(string)
 | ||
| 
 | ||
| 			// 调用审计服务记录日志(异步)
 | ||
| 			auditService.LogAction(
 | ||
| 				user,
 | ||
| 				reqCtx,
 | ||
| 				actionType,
 | ||
| 				description,
 | ||
| 				targetResource,
 | ||
| 				status,
 | ||
| 				resultDetails,
 | ||
| 			)
 | ||
| 
 | ||
| 			return err
 | ||
| 		}
 | ||
| 	}
 | ||
| }
 |