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)
 | |
| }
 |