我有2个表:users
和friends
。
friends
具有一个user_id
外键,该外键显然映射到users
id
键。
friends
还有一个friend_id
键,它也映射到users
id
键。
我正在使用JWT身份验证。我已经成功地在users
表上设置了权限,以便当用户查询用户时,该用户仅提取该特定用户的列。我还为users
表上的朋友创建了一个数组关系,因此user
行可以通过该关系具有friends
。
但是,当查询如下内容时:
{
user {
username
friends {
id
username
}
}
}
这对朋友返回null,因为用户角色无权访问朋友(由于会话变量X-Hasura-User-Id
用于按会话确定用户。我如何协调会话变量的工作,但又能够查询其他朋友?
答案 0 :(得分:1)
将此权限放在friends
上,然后用户可以看到friend_id
是其user.id
的所有朋友行:
{
"friend_id" :{
"_eq" : "X-Hasura-User-Id"
}
}
关系许可是从关系表继承的。因此,您只需要确保用户可以自己定期访问相关的表行,并且如果可以的话,它也将应用于关系。
不相关,看起来这些表具有相同的列。如果它们相同,则可能需要将users
-> users
中的自引用关系用作friends
。如果不忽略此=)
编辑:
尝试使用_exists
权限:
(您可以使用直接访问friends
和user
的关系来简化此操作,但是我不知道您的确切表和关系结构)
“如果表好友中存在,则'friend_id'为'X-Hasura-User-Id'并且'user_id'等于该行的用户ID的行”
{
"_or": [
{
"_exists": {
"_table": { "schema": "public", "name": "friends" },
"_where": {
"_and": [
{ "friend_id": { "_eq": "X-Hasura-User-Id" } },
{ "user_id": { "_ceq": "user_id" } }
]
}
}
},
{ "id": { "_eq": "X-Hasura-User-Id" } }
]
}