LicenseManger/internal/middleware/auth.go

73 lines
1.5 KiB
Go
Raw Normal View History

2024-11-14 14:55:43 +00:00
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
2024-11-16 15:59:15 +00:00
// // 1. 首先从 cookie 中获取 token
// tokenCookie, err := c.Cookie("token")
// if err == nil {
// token = tokenCookie
// }
2024-11-14 14:55:43 +00:00
// 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()
}
}