package api import ( "net/http" "strings" "d:\项目\dobaochet\backend\config" "d:\项目\dobaochet\backend\db" "d:\项目\dobaochet\backend\models" "d:\项目\dobaochet\backend\utils" "github.com/gin-gonic/gin" ) // AuthMiddleware 认证中间件 func AuthMiddleware(cfg *config.Config) gin.HandlerFunc { return func(c *gin.Context) { // 从请求头获取Authorization authHeader := c.GetHeader("Authorization") if authHeader == "" { c.JSON(http.StatusUnauthorized, gin.H{"error": "未提供认证令牌"}) c.Abort() return } // 检查Bearer前缀 parts := strings.SplitN(authHeader, " ", 2) if !(len(parts) == 2 && parts[0] == "Bearer") { c.JSON(http.StatusUnauthorized, gin.H{"error": "认证令牌格式错误"}) c.Abort() return } // 解析JWT令牌 claims, err := utils.ParseToken(parts[1], cfg.JWT.SecretKey) if err != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "无效的认证令牌"}) c.Abort() return } // 查询用户信息 var user models.User result := db.GetDB().Preload("Quota").First(&user, claims.UserID) if result.Error != nil { c.JSON(http.StatusUnauthorized, gin.H{"error": "用户不存在"}) c.Abort() return } // 检查用户是否激活 if !user.IsActive { c.JSON(http.StatusForbidden, gin.H{"error": "用户已被禁用"}) c.Abort() return } // 将用户信息设置到上下文 c.Set("user", user) c.Set("user_id", user.ID) c.Set("is_admin", user.IsAdmin) c.Next() } } // AdminMiddleware 管理员中间件 func AdminMiddleware() gin.HandlerFunc { return func(c *gin.Context) { // 从上下文获取用户信息 isAdmin, exists := c.Get("is_admin") if !exists || !isAdmin.(bool) { c.JSON(http.StatusForbidden, gin.H{"error": "需要管理员权限"}) c.Abort() return } c.Next() } } // CORSMiddleware CORS中间件 func CORSMiddleware(cfg *config.Config) gin.HandlerFunc { return func(c *gin.Context) { // 设置允许的来源 c.Writer.Header().Set("Access-Control-Allow-Origin", strings.Join(cfg.CORS.AllowOrigins, ",")) c.Writer.Header().Set("Access-Control-Allow-Credentials", "true") c.Writer.Header().Set("Access-Control-Allow-Headers", strings.Join(cfg.CORS.AllowHeaders, ",")) c.Writer.Header().Set("Access-Control-Allow-Methods", strings.Join(cfg.CORS.AllowMethods, ",")) if c.Request.Method == "OPTIONS" { c.AbortWithStatus(204) return } c.Next() } }