Hasura中如何利用请求头实现特定任务查询与变更操作?
问题描述
我正在跟随Hasura的Todo应用高级教程开发,现有Tasks表包含title、description、authorId、isComplete、isPublic列,权限配置为:用户仅能查询自有或公开任务,仅能更新自有任务。
我需要实现两个扩展功能:
- 仅查询不属于自己的公开任务,以及仅查询自有非公开任务;
- 将他人的公开任务标记为完成(仅允许更新
isComplete列,无需其他列权限)。
我尝试通过请求头x-hasura-user-id编写查询,但无法生效,示例查询如下:
query PublicTasksOnly { tasks(where: {isPublic: {_eq: true}, authorId: {_neq: x-hasura-user-id}}) { description isComplete title } }
解决方案
1. 实现特定条件的查询权限
Hasura不支持直接在GraphQL查询中裸写请求头变量,需通过权限规则或会话变量语法实现:
方式一:自定义角色与权限规则
在Hasura控制台的Tasks表权限页,针对select操作配置不同角色的权限:
- 针对「查询他人公开任务」:
创建新角色(如view_others_public_tasks),设置where条件为:{ "isPublic": {"_eq": true}, "authorId": {"_neq": "{{x-hasura-user-id}}"} } - 针对「查询自有非公开任务」:
创建新角色(如view_self_private_tasks),设置where条件为:{ "isPublic": {"_eq": false}, "authorId": {"_eq": "{{x-hasura-user-id}}"} }
给用户分配对应角色后,发起查询时只需正常请求,权限会自动过滤符合条件的数据。
方式二:查询中使用会话变量
在GraphQL查询中通过{{变量名}}引用会话变量,同时确保用户的基础select权限覆盖对应数据范围:
query PublicTasksOnly { tasks(where: {isPublic: {_eq: true}, authorId: {_neq: "{{x-hasura-user-id}}"}}) { description isComplete title } }
或者通过定义查询变量传入:
query PublicTasksOnly($userId: String!) { tasks(where: {isPublic: {_eq: true}, authorId: {_neq: $userId}}) { description isComplete title } }
请求时在变量参数中传入{"userId": "当前用户ID"}即可。
2. 实现他人公开任务的isComplete列更新权限
在Hasura控制台的Tasks表权限页,配置update操作权限:
- 设置过滤条件:限制仅能更新他人的公开任务,
where条件为:{ "isPublic": {"_eq": true}, "authorId": {"_neq": "{{x-hasura-user-id}}"} } - 限制列权限:在「列权限」区域仅勾选
isComplete,确保用户只能修改该列。 - 可选:强制更新值:如果需求是仅允许标记为完成(不能改回未完成),可设置
set条件:{ "isComplete": {"_eq": true} }
内容的提问来源于stack exchange,提问作者Haroldas Valčiukas
相关产品推荐
相关产品推荐

