59 lines
1.3 KiB
Go
59 lines
1.3 KiB
Go
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
|
|
}
|