Hasura 基于对象权限的授权

时间:2021-07-02 10:55:03

标签: hasura hasura-jwt

我正在尝试在 Hasura 上设置“行选择”权限。我有一个(为简洁起见而简化的)数据模型,如下所示

用户

id: UserID

应用

id: AppID

应用权限

user_id: User ID
app_id: App ID
permissions: [ ENUM: Admin, View, Owner ]

饲料

app_id: AppID
feed_data: Some Feed Data

现在,我希望为经过身份验证的用户查询所有 Feed。查询可以是形式

  • 获取经过身份验证的用户具有查看权限的所有应用
query MyQuery {
  feed(limit: 10) {
    app_id
    feed_data
  }
}
  • 在查询过滤器中使用 app_id 获取经过身份验证的用户具有查看权限的应用
query MyQuery {
  feed(limit: 10, where: {app_id: {_in: [1, 2]}}) {
    app_id
    feed_data
  }
}

由于 feed 表中没有直接包含 user_id 信息,因此我不能直接对 X-Hasura-User-Id 表使用 feed 属性。我还尝试对 _exists 表使用 app_permission 关系,但我无法在权限子句中放置 app_id 过滤器。

{
  "_exists": {
    "_where": {
      "user_id": {
        "_eq": "X-Hasura-User-Id"
      }
    },
    "_table": {
      "schema": "public",
      "name": "app_permission"
    }
  }
}

我不确定如何使用 Hasura 进行此类数据建模。任何帮助表示赞赏。谢谢。

2 个答案:

答案 0 :(得分:1)

既然你们没有直接关系,我觉得你可以通过appPermissions表查询,而不是直接查询feeds表。

当您创建一个以 appId 作为外键关系的 feeds 表时,Hasura 允许您跟踪这种关系,如下所示enter image description here 通过这种方式,您可以对 appPerms 表进行嵌套的 graphQL 查询,如下所示

query GetUserFeeds {
  test_appPerms {
    id
    userId
    feeds(limit: 10) {
      app_id
      id
      feed_data
    }
  }
}

enter image description here

答案 1 :(得分:1)

我想建议的另一件事是,您可以尝试在 x-hasura-app-id 旁边使用像 x-hasura-role 这样的会话变量,并围绕它建立您的权限。

https://hasura.io/docs/latest/graphql/core/auth/authorization/roles-variables.html

相关问题