Hasura调用GraphQL提示无效查询 插入用户权限校验失败问题
Hasura 插入用户数据触发permission-error解决方案
问题现象
- 携带普通
Authorization头执行users表插入mutation时返回权限错误,携带x-hasura-admin-secret头时相同语句可正常执行 - 接口返回错误如下:
{ "errors": [ { "extensions": { "path": "$.selectionSet.insert_users.args.objects", "code": "permission-error" }, "message": "check constraint of an insert/update permission has failed" } ] }
- 调用使用的GraphQL语句:
mutation MyMutation { insert_users(objects: {email: "ss", first_name: "dcy", last_name: "bc", public_address: "dfutdiytdg", user_id: "hcjh"}, on_conflict: {constraint: users_email_key}) { affected_rows returning { id first_name email } } }
- 已尝试操作:在Hasura控制台为users表开启插入、更新操作的所有权限选项,问题仍存在。
根因说明
携带admin密钥时Hasura会跳过所有权限校验,因此问题和GraphQL语句语法无关,完全是普通角色的权限配置存在漏项。报错指向插入/更新的权限校验规则未通过,结合语句带on_conflict的upsert场景,常见漏项集中在插入权限的upsert开关、行级校验规则、更新权限联动校验三个位置。
排查修复步骤
- 确认请求角色匹配:解码
Authorization头对应的JWT,确认x-hasura-default-role的值和你配置权限的角色完全一致,避免实际请求走了未配置权限的匿名/其他角色。 - 检查插入权限配置:
- 确认允许插入的列已覆盖语句中用到的
email/first_name/last_name/public_address/user_id所有字段 - 确认插入行校验规则(Check constraint for insert)和插入数据匹配:如果配置了类似
{"user_id": {"_eq": "X-Hasura-User-Id"}}的会话变量匹配规则,插入的user_id值必须和JWT解析出的X-Hasura-User-Id完全一致,否则直接触发校验失败,测试阶段可临时选择「无任何检查」验证问题 - 必须勾选Allow upsert(允许更新插入)开关:语句中带
on_conflict属于upsert场景,该开关默认关闭,未开启时直接触发权限错误
- 确认允许插入的列已覆盖语句中用到的
- 检查更新权限配置:
- upsert触发唯一键冲突时会执行更新逻辑,完全遵循更新权限的校验规则:首先确认允许更新的列覆盖冲突时可能变更的字段,其次确认更新前校验规则(Pre-update check)允许当前操作,测试阶段可临时配置为无检查验证
- 如果配置了列级更新条件(Only update columns if condition holds),需确认对应字段满足规则要求
- 检查查询权限配置:
- 语句中
returning块需要返回插入后的行数据,必须为对应角色开启users表的查询权限,且查询行校验规则能匹配到刚插入/更新的行,否则也会触发权限报错
- 语句中
内容的提问来源于stack exchange,提问作者SOHAM
相关产品推荐
相关产品推荐

