Files
xiaolajiaoyyds 6f71df4849 Initial open-source release
多平台账号批量注册系统,支持 OpenAI / Grok / Kiro / Gemini 平台的全自动注册。

Features:
- 用户名/密码注册登录(首个用户自动管理员)
- JWT 认证 + bcrypt 密码加密
- 积分系统与多用户管理
- HuggingFace Space 弹性 Worker 节点管理
- Cloudflare Worker 负载均衡
- 实时日志推送(SSE/WebSocket)
- 管理后台(用户管理、系统设置、代理池、卡池)

Tech Stack: Go 1.25 / Gin / GORM / PostgreSQL / Vue 3 / Vite / TailwindCSS
2026-03-22 03:44:42 +08:00

80 lines
1.7 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package middleware
import (
"net/http"
"strings"
"github.com/gin-gonic/gin"
"github.com/xiaolajiaoyyds/regplatformm/internal/model"
"github.com/xiaolajiaoyyds/regplatformm/internal/service"
)
// Auth JWT 认证中间件
// token 提取优先级:Cookie("token") > X-Auth-Token > Authorization Bearer
func Auth(authSvc *service.AuthService) gin.HandlerFunc {
return func(c *gin.Context) {
// 1. Cookie
token, _ := c.Cookie("token")
// 2. X-Auth-Token header
if token == "" {
token = c.GetHeader("X-Auth-Token")
}
// 3. Authorization: Bearer xxx
if token == "" {
auth := c.GetHeader("Authorization")
if strings.HasPrefix(auth, "Bearer ") {
token = auth[7:]
}
}
// 4. Query parameter(SSE 用)
if token == "" {
token = c.Query("token")
}
if token == "" {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"detail": "未登录"})
return
}
userID, err := authSvc.VerifyJWT(token)
if err != nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, gin.H{"detail": "登录已过期"})
return
}
user, err := authSvc.GetActiveUser(userID)
if err != nil {
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"detail": "账号不可用"})
return
}
c.Set("user", user)
c.Set("userID", user.ID)
c.Next()
}
}
// GetUser 从 gin.Context 中提取当前用户
func GetUser(c *gin.Context) *model.User {
u, exists := c.Get("user")
if !exists {
return nil
}
return u.(*model.User)
}
// Admin 管理员权限中间件(需在 Auth 之后使用)
func Admin() gin.HandlerFunc {
return func(c *gin.Context) {
user := GetUser(c)
if user == nil || !user.IsAdmin {
c.AbortWithStatusJSON(http.StatusForbidden, gin.H{"detail": "需要管理员权限"})
return
}
c.Next()
}
}