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

Hasura中如何利用请求头实现特定任务查询与变更操作?

问题描述

我正在跟随Hasura的Todo应用高级教程开发,现有Tasks表包含title、description、authorId、isComplete、isPublic列,权限配置为:用户仅能查询自有或公开任务,仅能更新自有任务。

我需要实现两个扩展功能:

  1. 仅查询不属于自己的公开任务,以及仅查询自有非公开任务;
  2. 将他人的公开任务标记为完成(仅允许更新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操作权限:

  1. 设置过滤条件:限制仅能更新他人的公开任务,where条件为:
    {
      "isPublic": {"_eq": true},
      "authorId": {"_neq": "{{x-hasura-user-id}}"}
    }
    
  2. 限制列权限:在「列权限」区域仅勾选isComplete,确保用户只能修改该列。
  3. 可选:强制更新值:如果需求是仅允许标记为完成(不能改回未完成),可设置set条件:
    {
      "isComplete": {"_eq": true}
    }
    

内容的提问来源于stack exchange,提问作者Haroldas Valčiukas

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 00:25:22