69 lines
1.6 KiB
Go
69 lines
1.6 KiB
Go
package middleware
|
|
|
|
import (
|
|
"hr_receiver/config"
|
|
"hr_receiver/models"
|
|
"hr_receiver/util"
|
|
"net/http"
|
|
"strings"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
func JWTAuth() gin.HandlerFunc {
|
|
return func(c *gin.Context) {
|
|
authHeader := c.GetHeader("Authorization")
|
|
if authHeader == "" {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header required"})
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
// Bearer Token格式
|
|
parts := strings.SplitN(authHeader, " ", 2)
|
|
if !(len(parts) == 2 && parts[0] == "Bearer") {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "Authorization header format must be Bearer {token}"})
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
// 解析Token
|
|
claims, err := util.ParseToken(parts[1])
|
|
if err != nil {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "Invalid or expired token"})
|
|
c.Abort()
|
|
return
|
|
}
|
|
|
|
role := claims.Role
|
|
flavorType := claims.FlavorType
|
|
regionIDs := claims.RegionIDs
|
|
|
|
if role == "" || flavorType == "" {
|
|
var user models.User
|
|
if err := config.DB.Preload("Regions").First(&user, claims.UserID).Error; err != nil {
|
|
c.JSON(http.StatusUnauthorized, gin.H{"error": "User not found"})
|
|
c.Abort()
|
|
return
|
|
}
|
|
if !user.IsActive {
|
|
c.JSON(http.StatusForbidden, gin.H{"error": "User is disabled"})
|
|
c.Abort()
|
|
return
|
|
}
|
|
role = user.Role
|
|
flavorType = user.FlavorType
|
|
regionIDs = user.RegionIDs()
|
|
}
|
|
|
|
// 将用户信息存入上下文
|
|
c.Set("userID", claims.UserID)
|
|
c.Set("username", claims.Username)
|
|
c.Set("role", role)
|
|
c.Set("flavorType", flavorType)
|
|
c.Set("regionIDs", regionIDs)
|
|
|
|
c.Next()
|
|
}
|
|
}
|