package middleware import ( "licserver/internal/utils" "net/http" "strings" "github.com/gin-gonic/gin" ) func JWTAuth(config *utils.JWTConfig) gin.HandlerFunc { return func(c *gin.Context) { var token string // 1. 首先从 cookie 中获取 token tokenCookie, err := c.Cookie("token") if err == nil { token = tokenCookie } // 2. 如果 cookie 中没有,则从 header 中获取 if token == "" { auth := c.GetHeader("Authorization") if auth != "" { parts := strings.SplitN(auth, " ", 2) if len(parts) == 2 && parts[0] == "Bearer" { token = parts[1] } } } // 3. 如果 query 参数中有 token,也可以使用 if token == "" { token = c.Query("token") } // 如果都没有找到 token if token == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "未提供认证信息"}) c.Abort() return } // 验证 token claims, err := utils.ParseToken(token, config) if err != nil { // 如果 token 无效,清除 cookie // c.SetCookie("token", "", -1, "/", "", true, true) c.JSON(http.StatusUnauthorized, gin.H{"error": "无效的token"}) c.Abort() return } // 将用户信息存储到上下文 c.Set("userID", claims.UserID) c.Set("username", claims.Username) c.Set("role", claims.Role) // 如果是从 header 或 query 参数获取的 token,设置到 cookie 中 if tokenCookie == "" { // 设置 cookie,过期时间与 token 一致 // c.SetCookie("token", token, int(claims.ExpiresAt.Unix()-claims.IssuedAt.Unix()), "/", "", false, true) } c.Next() } } // AdminRequired 检查用户是否为管理员 func AdminRequired() gin.HandlerFunc { return func(c *gin.Context) { role, exists := c.Get("role") if !exists || role != "admin" { c.JSON(http.StatusForbidden, gin.H{"error": "需要管理员权限"}) c.Abort() return } c.Next() } }