package middleware import ( "kra/pkg/jwt" khttp "github.com/go-kratos/kratos/v2/transport/http" ) // claimsKey 用于context存储claims的key type claimsKey struct{} // GetAuthorityID 从Kratos HTTP Context获取用户角色ID func GetAuthorityID(ctx khttp.Context) uint { claims, ok := GetClaims(ctx) if !ok { return 0 } return claims.AuthorityID } // GetUserID 从Kratos HTTP Context获取用户ID func GetUserID(ctx khttp.Context) uint { claims, ok := GetClaims(ctx) if !ok { return 0 } return claims.BaseClaims.ID } // GetClaims 从Kratos HTTP Context获取JWT Claims func GetClaims(ctx khttp.Context) (*jwt.CustomClaims, bool) { // 尝试从request context获取 if claims, ok := ctx.Request().Context().Value(claimsKey{}).(*jwt.CustomClaims); ok { return claims, true } // 尝试使用字符串key if claims, ok := ctx.Request().Context().Value("claims").(*jwt.CustomClaims); ok { return claims, true } return nil, false } // GetToken 从Kratos HTTP Context获取Token func GetToken(ctx khttp.Context) string { // 从header获取 token := ctx.Request().Header.Get("x-token") if token != "" { return token } // 从cookie获取 if cookie, err := ctx.Request().Cookie("x-token"); err == nil { return cookie.Value } return "" } // GetUserUUID 从Kratos HTTP Context获取用户UUID func GetUserUUID(ctx khttp.Context) string { claims, ok := GetClaims(ctx) if !ok { return "" } return claims.UUID }