package middleware import ( "strconv" "strings" "github.com/gin-gonic/gin" "portal-mini-go/internal/pkg/errors" "portal-mini-go/internal/pkg/token" ) const adminIDCtxKey = "admin_id" // AdminAuth 校验后台请求的 Bearer JWT,校验通过后将 admin_id 注入 context。 func AdminAuth(jwtSecret string) gin.HandlerFunc { return func(c *gin.Context) { auth := c.GetHeader("Authorization") const prefix = "Bearer " if !strings.HasPrefix(auth, prefix) { c.Error(errors.ErrUnauthorized) c.Abort() return } claims, err := token.Parse(jwtSecret, strings.TrimPrefix(auth, prefix)) if err != nil { c.Error(errors.ErrUnauthorized) c.Abort() return } c.Set(adminIDCtxKey, claims.AdminID) c.Next() } } // AdminID 从 gin.Context 取出已认证的后台管理员 ID(字符串形式,与 JWT 载荷一致)。 func AdminID(c *gin.Context) string { if v, ok := c.Get(adminIDCtxKey); ok { if s, ok := v.(string); ok { return s } } return "" } // AdminIDUint 从 gin.Context 取出已认证的后台管理员 ID 并解析为 uint64。 // 解析失败返回 (0, false),调用方应按“未认证”处理。 func AdminIDUint(c *gin.Context) (uint64, bool) { s := AdminID(c) if s == "" { return 0, false } id, err := strconv.ParseUint(s, 10, 64) if err != nil { return 0, false } return id, true }