This commit is contained in:
toom1996
2026-09-03 19:45:20 +08:00
parent ffe84efc4c
commit b049104a0b
8 changed files with 99 additions and 22 deletions

View File

@ -51,15 +51,29 @@ func requireAuth(c *gin.Context, manager *jwt.Manager) {
// PublicFirstPageAuth 列表接口「首页公开、翻页需登录」鉴权中间件。
//
// 仅当分页参数 page 缺失或 <= 1 时放行(无需 token),其余页要求有效的
// Authorization: Bearer <token>,否则返回 401。用于让列表首屏对游客/SEO 可见,
// 同时保留翻页 / 批量枚举的登录门槛(防爬虫直接 dump 全量)。
// 行为:
// - 始终尝试解析 Authorization: Bearer <token>(若存在且有效则写入 Context),
// 供下游 handler 判断登录态(如未登录预览截断)。
// - 仅当 page>1 时才强制要求有效 token,否则返回 401;首页(page 缺失或 <= 1)
// 无 token 也能放行,让游客/SEO 看到首屏。
//
// 这样既让列表首屏对游客可见,又保留翻页 / 批量枚举的登录门槛(防爬虫 dump 全量)。
func PublicFirstPageAuth(manager *jwt.Manager) gin.HandlerFunc {
return func(c *gin.Context) {
// 解析并写入登录态(若存在有效 token),但不强制。
if header := c.GetHeader("Authorization"); strings.HasPrefix(header, bearerPrefix) {
if claims, err := manager.Parse(strings.TrimPrefix(header, bearerPrefix)); err == nil {
c.Set(ContextUserID, claims.UserID)
c.Set(ContextUsername, claims.Username)
}
}
// 非首页:必须有有效 token,否则 401。
if pageStr := c.Query("page"); pageStr != "" {
if n, err := strconv.Atoi(pageStr); err == nil && n > 1 {
requireAuth(c, manager) // 非首页:走完整 JWT 校验
return
if _, ok := c.Get(ContextUserID); !ok {
response.AbortError(c, http.StatusUnauthorized, "missing or invalid token")
return
}
}
}
c.Next() // 首页(page 缺失或 <= 1)放行