Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Permissions 在GraphQL和Hasura中实现自定义用户权限_Permissions_Graphql_Hasura - Fatal编程技术网

Permissions 在GraphQL和Hasura中实现自定义用户权限

Permissions 在GraphQL和Hasura中实现自定义用户权限,permissions,graphql,hasura,Permissions,Graphql,Hasura,我正在创建一个webapp,允许用户在几个不同的房间里进行交流,我希望我可以使用GraphQL和Hasura来完成这个项目。管理员可以创建/删除文件室(wow文件室、lol文件室、pubg文件室)、创建/删除用户、创建/删除权限(admin、wow、lol、pubg)以及为用户分配角色。用户将能够看到他们所允许的任何房间 问题是,我想确保只有管理员才能创建/删除这些文件室/用户/权限,并且只有正确的用户才能看到这些文件室。有没有办法让Hasura检查给定用户的权限并返回适当的数据?我认为我需要编

我正在创建一个webapp,允许用户在几个不同的房间里进行交流,我希望我可以使用GraphQL和Hasura来完成这个项目。管理员可以创建/删除文件室(wow文件室、lol文件室、pubg文件室)、创建/删除用户、创建/删除权限(admin、wow、lol、pubg)以及为用户分配角色。用户将能够看到他们所允许的任何房间


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

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

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

Hasura允许您设置一个权限规则来遍历关系,这使得这成为可能。看看这本书

假设您的模型是
房间
用户
房间_用户
,并且您已设置了关系,以便
房间。用户
返回特定房间的用户列表,则
房间
表上的
用户
角色的权限可以表示为:

Allow SELECT on a row in rooms if
rooms.users.id: _eq: x-hasura-user-id
这意味着:如果一个文件室的用户列表至少包含一个等于x-hasura-user-id的用户id,则授予对该文件室的访问权

我在heroku应用程序上设置了此选项:

在GraphiQL中尝试以下查询:

  • 将标题设置为:
  • 运行以下查询:
  • 您将看到响应只包含user1有权访问的房间
  • 通过不同的值1、2、3、4、5、6切换
    x-hasura-user-id
    ,您将看到相同查询的不同结果。基本上是只有当前用户才能访问的正确房间
  • 在以下位置签出模型和模型的权限:

    • 用户和房间映射:
    • 房间权限:

    Hasura支持细粒度访问控制。查看授权文档:我的印象是不支持动态角色。因为管理员可以创建一个文件室,并在文件室周围创建各种角色,所以这可能不适用。但我会再读一遍,看看它是否解决了我的问题。
    x-hasura-role: user
    x-hasura-user-id: 1
    
     query {
       rooms {
         id
         name
       }
     }