74 lines
1.7 KiB
Go
74 lines
1.7 KiB
Go
package middleware
|
|
|
|
import (
|
|
"context"
|
|
"net/http"
|
|
"strconv"
|
|
"strings"
|
|
"time"
|
|
|
|
db "management/internal/db/sqlc"
|
|
|
|
"github.com/zhang2092/browser"
|
|
)
|
|
|
|
func (m *middleware) Audit(next http.Handler) http.Handler {
|
|
fn := func(w http.ResponseWriter, r *http.Request) {
|
|
start := time.Now()
|
|
defer func(res http.ResponseWriter, req *http.Request) {
|
|
// 记录审计日志
|
|
go m.writeLog(req, start)
|
|
}(w, r)
|
|
next.ServeHTTP(w, r)
|
|
}
|
|
|
|
return http.HandlerFunc(fn)
|
|
}
|
|
|
|
func (m *middleware) writeLog(req *http.Request, start time.Time) {
|
|
end := time.Now()
|
|
duration := end.Sub(start)
|
|
var params string
|
|
method := req.Method
|
|
if method == "GET" {
|
|
params = req.URL.Query().Encode()
|
|
} else if method == "POST" {
|
|
contentType := req.Header.Get("Content-Type")
|
|
if strings.Contains(contentType, "application/json") {
|
|
body := make([]byte, req.ContentLength)
|
|
req.Body.Read(body)
|
|
params = string(body)
|
|
} else if strings.Contains(contentType, "application/x-www-form-urlencoded") {
|
|
params = req.Form.Encode()
|
|
}
|
|
}
|
|
|
|
ctx := req.Context()
|
|
au := m.AuthUser(ctx)
|
|
arg := &db.CreateSysAuditLogParams{
|
|
CreatedAt: time.Now(),
|
|
Email: au.Email,
|
|
Username: au.Username,
|
|
UserUuid: au.Uuid,
|
|
StartAt: start,
|
|
EndAt: end,
|
|
Duration: strconv.FormatInt(duration.Milliseconds(), 10),
|
|
Url: req.URL.RequestURI(),
|
|
Method: method,
|
|
Parameters: params,
|
|
RefererUrl: req.Header.Get("Referer"),
|
|
Ip: req.RemoteAddr,
|
|
Remark: "",
|
|
}
|
|
br, err := browser.NewBrowser(req.Header.Get("User-Agent"))
|
|
if err == nil {
|
|
arg.Os = br.Platform().Name()
|
|
arg.Browser = br.Name()
|
|
}
|
|
|
|
c, cancel := context.WithTimeout(context.Background(), time.Second*3)
|
|
defer cancel()
|
|
|
|
_ = m.biz.AuditBiz().Create(c, arg)
|
|
}
|