Files
pig-farm-controller/internal/app/middleware/audit.go

67 lines
2.1 KiB
Go
Raw Normal View History

2025-09-28 00:13:47 +08:00
package middleware
import (
2025-11-05 18:38:41 +08:00
"context"
2025-10-02 00:18:13 +08:00
"git.huangwc.com/pig/pig-farm-controller/internal/domain/audit"
2025-11-05 18:38:41 +08:00
"git.huangwc.com/pig/pig-farm-controller/internal/infra/logs"
2025-09-28 01:02:29 +08:00
"git.huangwc.com/pig/pig-farm-controller/internal/infra/models"
2025-11-05 19:57:30 +08:00
2025-10-30 16:58:08 +08:00
"github.com/labstack/echo/v4"
2025-09-28 00:13:47 +08:00
)
2025-10-30 16:58:08 +08:00
// AuditLogMiddleware 创建一个Echo中间件用于在请求结束后记录用户操作审计日志。
// 它依赖于控制器通过调用 SendSuccessWithAudit 或 SendErrorWithAudit 在上下文中设置的审计信息。
2025-11-05 18:38:41 +08:00
func AuditLogMiddleware(ctx context.Context, auditService audit.Service) echo.MiddlewareFunc {
2025-10-30 16:58:08 +08:00
return func(next echo.HandlerFunc) echo.HandlerFunc {
return func(c echo.Context) error {
2025-11-05 18:38:41 +08:00
newCtx := logs.AddFuncName(ctx, c.Request().Context(), "AuditLogMiddleware")
2025-10-30 16:58:08 +08:00
// 首先执行请求链中的后续处理程序(即业务控制器)
err := next(c)
// --- 在这里,请求已经处理完毕 ---
// 从上下文中尝试获取由控制器设置的业务审计信息
actionType, exists := c.Get(models.ContextAuditActionType.String()).(string)
if !exists || actionType == "" {
// 如果上下文中没有 actionType说明此接口无需记录审计日志直接返回
return err
2025-09-28 00:13:47 +08:00
}
2025-10-30 16:58:08 +08:00
// 从 Context 中获取用户对象
var user *models.User
if userCtx := c.Get(models.ContextUserKey.String()); userCtx != nil {
user, _ = userCtx.(*models.User)
}
2025-09-28 00:13:47 +08:00
2025-10-30 16:58:08 +08:00
// 构建 RequestContext
reqCtx := audit.RequestContext{
ClientIP: c.RealIP(),
HTTPPath: c.Request().URL.Path,
HTTPMethod: c.Request().Method,
}
2025-09-28 00:13:47 +08:00
2025-10-30 16:58:08 +08:00
// 直接从上下文中获取所有其他审计信息
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(
2025-11-05 18:38:41 +08:00
newCtx,
2025-10-30 16:58:08 +08:00
user,
reqCtx,
actionType,
description,
targetResource,
status,
resultDetails,
)
return err
}
2025-09-28 00:13:47 +08:00
}
}