【问题标题】:Implementing custom user permissions in GraphQL and Hasura在 GraphQL 和 Hasura 中实现自定义用户权限
【发布时间】:2020-06-08 16:43:39
【问题描述】:

我正在创建一个 web 应用程序,允许用户在几个不同的房间进行交流,我希望我可以在这个项目中使用 GraphQL 和 Hasura。将有管理员可以创建/删除房间(wow-room、lol-Room、pubg-room),创建/删除用户,以及创建/删除权限(admin、wow、lol、pubg)以及为用户分配角色。用户将能够看到他们有权访问的任何房间。

问题是,我想确保只有管理员才能创建/删除这些房间/用户/权限,并且只有正确的用户才能看到这些房间。有没有办法让 Hasura 检查给定用户的权限并返回适当的数据?我相信我需要编写一个自定义解析器,但不确定如何完成或者它是否是正确的解决方案。

【问题讨论】:

  • Hasura 支持细粒度的访问控制。查看授权文档:docs.hasura.io/1.0/graphql/manual/auth/authorization/index.html
  • 我的印象是不支持动态角色。由于管理员可以创建房间并在房间周围创建各种角色,因此这可能不适用。但我会再读一遍,看看它是否能解决我的问题。

标签: permissions graphql hasura


【解决方案1】:

虽然 Hasura 可以使用 Hasura 处理动态角色(您可以使用 API 即时创建新角色和新权限规则),但我认为在这种情况下这不是必需的。

问题是,我想确保只有管理员可以 创建/删除这些房间/用户/权限,并且只有正确的 用户可以看到这些房间。有没有办法让 Hasura 检查 给定用户的权限并返回适当的数据?

Hasura 允许您设置遍历关系的权限规则,这使得这成为可能。查看article-collaborators example in the Hasura docs

假设您的模型是 roomsusersroom_users,并且您设置了关系,以便 room.users 返回特定房间的用户列表,user 角色的权限rooms 表可以表示如下:

Allow SELECT on a row in rooms if
rooms.users.id: _eq: x-hasura-user-id

这意味着:如果房间的用户列表包含至少一个 user_id 等于 x-hasura-user-id,则授予对该房间的访问权限。

我已经在 Heroku 应用上设置了这个:https://multiple-roles-hasura.herokuapp.com/console/api-explorer

在 GraphiQL 中尝试以下查询:

  1. 将标题设置为:
x-hasura-role: user
x-hasura-user-id: 1
  1. 运行以下查询:
 query {
   rooms {
     id
     name
   }
 }
  1. 您会看到响应仅包含 user1 有权访问的房间
  2. 通过不同的值 1、2、3、4、5、6 切换 x-hasura-user-id,您将看到相同查询的不同结果。基本上只有当前用户可以访问的正确房间。

检查模型和模型的权限:

【讨论】:

    猜你喜欢
    • 2020-06-20
    • 2020-11-23
    • 2020-10-14
    • 1970-01-01
    • 2020-11-07
    • 1970-01-01
    • 2020-07-16
    • 2013-02-27
    • 1970-01-01
    相关资源
    最近更新 更多