gpt4 book ai didi

firebase - 如何使用firebase规则检查用户组数组和记录组数组是否相交

转载 作者:行者123 更新时间:2023-12-03 06:22:13 25 4
gpt4 key购买 nike

我在 firebase 中有一个记录列表,其中有一个包含零个或多个组的组属性。我还有 firebase auth 对象,它也将有零个或多个组。我想为我的记录设置一个 .read firebase 规则,该规则将检查两个列表中是否至少存在一个组。

换句话说,我有一个用户,该用户拥有一组已分配给它的组。我有一些记录,其中还包含一些组列表,指定用户必须拥有哪些组才能访问它们。如果登录的用户尝试访问该记录,我想确保该用户至少拥有该记录所需的一个组。

在客户端我会做类似 _.intersect(userGroups, recordGroups).length > 0

我不确定如何在 firebase 规则表达式中执行此操作。如果它能像这样工作那就太酷了。

记录:

{
someData: "test"
groups: ['foo', 'bar']
}

Firebase 身份验证对象:

{
userName: "Bob",
groups: ['foo', 'bar']
}

规则数据:

{
"rules": {
"records": {
"$recordId": {
".read": "data.child('groups').intersectsWith(auth.groups)"
}
}
}
}

谢谢。

更新:我认为如果 hasChildren() 使用 ||我可以将组名称放在关键位置,并以这种方式检查它们是否存在,而不是 && 。类似于 "data.child('groups').hasChildren(auth.groups, 'or')"

记录位置:

{
someData: "test"
groups: {
'foo': '',
'bar': ''
}
}

更新2:根据加藤的评论和链接,我意识到即使 hasChildren 可以做 OR 它仍然无法正常工作。对单个记录的请求可以工作,但如果当前用户无权访问每条记录,则对所有记录的请求将会出错。

目前还不清楚如何构建数据来完成这项工作。如果一条记录可以属于多个组,那将如何工作?这是一种非常常见的场景(基本上是 linux 组权限的工作原理),所以我不能是唯一一个尝试这样做的人。有人有关于如何在 firebase 中实现此目的的任何想法/示例吗?

最佳答案

目前来看,我认为这是不可能的。允许使用的变量、方法和运算符数量有限,如下所示:

Firebase Security Rules API

由于规则中不允许函数定义,因此您不能做任何花哨的事情,例如在数组上调用 array.some(callback) 来自己进行匹配。

据我所知,您有三个选择:

1) 复制数据,这样您就不需要进行检查。这就是我在项目中所做的:我希望一些用户数据(名称)可供在其网络列表中共享网络的用户使用。最初我想检查两个成员的网络列表,看看是否至少有一个匹配。最终我意识到,将每个用户的名称保存为网络数据的一部分会更容易,这样就不必进行需要这种奇怪权限的用户查找。我对您的数据了解不够,无法建议您需要复制哪些内容。

2) 使用字符串而不是数组。您可以将一个字符串转换为正则表达式(或仅将其保存为正则表达式格式),并使用它来搜索另一个字符串以查找匹配项。 Firebase DB Regex Docs

3) 如果您有足够多的像这样的奇怪情况,请实际运行一个以自定义方式验证请求的服务器。在数据库中,只需授予您的服务器权限。您可以使用 Firebase Cloud Functions或者推出使用 Firebase Admin SDK 的您自己的服务器

关于firebase - 如何使用firebase规则检查用户组数组和记录组数组是否相交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30160086/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com