合并 main 分支并融合订单列表最小化与 SQL 治理
- Auth/权限中间件取 main 演进版(错误细分、token 来源),保留 dev 的用户 cookie 与登出撤销语义 - 后台订单列表:融合 main 的首页免 COUNT 优化与关键词索引路由,保留 dev 的最小化 AdminOrderListItemDTO(结账明细仍由详情接口返回,同步调整对应集成测试) - 保留 dev 的 token_version 冻结/解冻递增与 main 的状态变化判断及通知 - 前端:保留 dev 登出接口与 main 的 fetchMe silent 参数、SSE 登录跳转;后台订单表按 dev 最小化 DTO 移除号主到手列
This commit is contained in:
@@ -35,6 +35,8 @@ type AdminTokenContext struct {
|
||||
|
||||
type AdminTokenValidatorFunc func(ctx context.Context, adminID uint64, tokenVersion int64) (AdminTokenContext, error)
|
||||
|
||||
type UserTokenValidatorFunc func(ctx context.Context, userID uint64, tokenVersion int64) error
|
||||
|
||||
func extractBearerToken(c *gin.Context) string {
|
||||
header := c.GetHeader("Authorization")
|
||||
tokenText := strings.TrimSpace(strings.TrimPrefix(header, "Bearer "))
|
||||
@@ -44,13 +46,19 @@ func extractBearerToken(c *gin.Context) string {
|
||||
return ""
|
||||
}
|
||||
|
||||
type UserTokenValidatorFunc func(ctx context.Context, userID uint64, tokenVersion int64) error
|
||||
|
||||
func Auth(jwtManager *auth.JWTManager, validators ...UserTokenValidatorFunc) gin.HandlerFunc {
|
||||
var validate UserTokenValidatorFunc
|
||||
if len(validators) > 0 {
|
||||
validate = validators[0]
|
||||
func extractAdminToken(c *gin.Context) (string, string) {
|
||||
if tokenText := extractBearerToken(c); tokenText != "" {
|
||||
return tokenText, "bearer"
|
||||
}
|
||||
if cookieToken, err := c.Cookie(AdminAccessCookieName); err == nil {
|
||||
if tokenText := strings.TrimSpace(cookieToken); tokenText != "" {
|
||||
return tokenText, "cookie"
|
||||
}
|
||||
}
|
||||
return "", "none"
|
||||
}
|
||||
|
||||
func Auth(jwtManager *auth.JWTManager, validate UserTokenValidatorFunc) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
tokenText := extractBearerToken(c)
|
||||
if tokenText == "" {
|
||||
@@ -72,7 +80,11 @@ func Auth(jwtManager *auth.JWTManager, validators ...UserTokenValidatorFunc) gin
|
||||
}
|
||||
if validate != nil {
|
||||
if err := validate(c.Request.Context(), claims.UserID, claims.TokenVersion); err != nil {
|
||||
response.Unauthorized(c, "访问令牌无效或已过期")
|
||||
if errors.Is(err, auth.ErrDependencyUnavailable) {
|
||||
response.ServiceUnavailable(c, "用户认证服务暂时不可用")
|
||||
} else {
|
||||
response.Unauthorized(c, "登录状态已失效,请重新登录")
|
||||
}
|
||||
c.Abort()
|
||||
return
|
||||
}
|
||||
@@ -86,16 +98,9 @@ func Auth(jwtManager *auth.JWTManager, validators ...UserTokenValidatorFunc) gin
|
||||
|
||||
func AdminAuth(jwtManager *auth.JWTManager, validate AdminTokenValidatorFunc) gin.HandlerFunc {
|
||||
return func(c *gin.Context) {
|
||||
tokenText := extractBearerToken(c)
|
||||
tokenSource := "bearer"
|
||||
tokenText, tokenSource := extractAdminToken(c)
|
||||
if tokenText == "" {
|
||||
if cookieToken, err := c.Cookie(AdminAccessCookieName); err == nil {
|
||||
tokenText = strings.TrimSpace(cookieToken)
|
||||
tokenSource = "cookie"
|
||||
}
|
||||
}
|
||||
if tokenText == "" {
|
||||
RecordAdminAuthFailure(c, "missing", "none", 0, 0)
|
||||
RecordAdminAuthFailure(c, "missing", tokenSource, 0, 0)
|
||||
response.Unauthorized(c, "缺少后台访问令牌")
|
||||
c.Abort()
|
||||
return
|
||||
|
||||
Reference in New Issue
Block a user