You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Hasura日志角色显示异常:无表权限时使用UNAUTHORIZED_ROLE

问题描述

我正在配置NextJS通过ApolloClient查询Hasura,在每个请求中传递JWT作为请求头,代码如下:

headers['Authorization'] = `Bearer ${session.signedJwt}`;
headers['x-hasura-role'] = 'user';
const httpLink = new HttpLink({ uri, headers });
const client = new ApolloClient({
  link:  httpLink,
  cache: new InMemoryCache(),
  connectToDevTools: true,
});
return <ApolloProvider client={client}>{children}</ApolloProvider>

这是标准的Provider模式。同时我在docker-compose.yaml中配置了Hasura的JWT认证环境变量:

HASURA_GRAPHQL_ADMIN_SECRET: SuperUltraSecret
HASURA_GRAPHQL_JWT_SECRET: '{ "type": "HS256", "key": "0123456789abcdef0123456789abcdef" }'
HASURA_GRAPHQL_UNAUTHORIZED_ROLE: serverless_function

我有一个名为Sites的Hasura表,以及名为user的角色。当user角色无Sites表的任何权限时,查询请求的Hasura日志中,user_vars显示为{"x-hasura-role":"serverless_function"},这让我误以为角色未正确从JWT提取,耗费大量时间排查。但当给user角色授予Sites表的查询权限(未开放字段权限)后,同一查询的日志中user_vars正确显示{"x-hasura-role":"user","x-hasura-user-id":"d377181c-14f2-40e3-a1bb-1bb7bbdf49d5"}。请问该现象是Hasura的bug还是设计特性?是否需要向Hasura官方上报?


回答

这是Hasura的设计特性,并非bug,不需要向官方上报。

核心机制说明

Hasura内置了权限降级逻辑:当请求携带的角色对目标操作完全无权限时,系统会自动切换到HASURA_GRAPHQL_UNAUTHORIZED_ROLE指定的角色处理请求,此时日志中的user_vars会显示降级后的角色信息。

具体到你的场景:

  1. 当user角色无Sites表的任何权限时,Hasura判定该角色无法执行查询操作,触发降级,切换到serverless_function角色,因此日志里的user_vars显示这个降级后的角色。
  2. 给user角色授予Sites表的查询权限后,Hasura确认该角色具备执行请求的基础权限,不再触发降级,因此保留了从JWT中解析出的完整用户变量(包括角色和用户ID)。

排查建议

后续遇到类似问题时,不要仅依赖user_vars日志,可从以下方向排查:

  • 检查目标角色对操作对象(表/字段)的权限配置是否正确
  • 使用Hasura控制台的JWT测试工具验证JWT解析结果是否符合预期
  • 查看请求返回的具体权限错误信息(若有),辅助定位问题

内容的提问来源于stack exchange,提问作者NULL pointer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 07:16:05