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