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会显示降级后的角色信息。
具体到你的场景:
- 当
user角色无Sites表的任何权限时,Hasura判定该角色无法执行查询操作,触发降级,切换到serverless_function角色,因此日志里的user_vars显示这个降级后的角色。 - 给
user角色授予Sites表的查询权限后,Hasura确认该角色具备执行请求的基础权限,不再触发降级,因此保留了从JWT中解析出的完整用户变量(包括角色和用户ID)。
排查建议
后续遇到类似问题时,不要仅依赖user_vars日志,可从以下方向排查:
- 检查目标角色对操作对象(表/字段)的权限配置是否正确
- 使用Hasura控制台的JWT测试工具验证JWT解析结果是否符合预期
- 查看请求返回的具体权限错误信息(若有),辅助定位问题
内容的提问来源于stack exchange,提问作者NULL pointer
相关产品推荐
相关产品推荐

