使用数组元素的FireBase身份验证规则

本教程将介绍使用数组元素的FireBase身份验证规则的处理方法,这篇教程是从别的地方看到的,然后加了一些国外程序员的疑问与解答,希望能对你有所帮助,好了,下面开始学习吧。

使用数组元素的FireBase身份验证规则 教程 第1张

问题描述

我正在将Firebase与REACT本机一起使用。在我的应用程序中,我允许用户与以下用户共享内容:读取、复制或修改权限,与特定用户或所有用户共享。
由于Firebase不为查询提供OR函数,因此我使用一个数组来存储User:权限组合,这样我就可以使用数组-CONTAINS-ANY功能进行查询,如下所示

.where("access", "array-contains-any", [user_id, `${user_id}:R`, `${user_id}:C`, `${user_id}:M`, "All_R", "All_C", "All_M"])

这使我可以使用R、C或M权限查询由user_id拥有、共享给user_id或共享给"all"的所有内容。

现在,我想对身份验证规则执行类似的操作(以便只有具有权限的用户才能修改等。)通过将经过身份验证的用户ID与阵列中的用户ID进行比较。为此,它将需要类似于身份验证规则的"数组-包含-any"和字符串连接的功能。

这可能吗?或者我需要做一些不同的事情吗?

推荐答案

我运行了几个测试,我想我得到了您正在工作的类型的子集。我将逐步完成下面的步骤,这样您就可以在最后构建它。


第一步是使此查询工作:

ref.where("access", "array-contains", user_id)

这很容易通过:

进行保护

allow list: if request.auth != null && request.auth.uid in resource.data.access;

因此,如果access数组中提到了任何人的UID,则任何人都可以阅读文档。


下一步是允许此查询:

ref.where("access", "array-contains-any", [user_id, user_id+":R"]);

当我们针对前面的规则运行此操作时,不允许这样做。这是因为我们正在请求规则不知道的值。

要使其正常工作,请将规则更改为:

allow list: if request.auth != null && (
  request.auth.uid in resource.data.access || 
  request.auth.uid+":R" in resource.data.access
);

现在代码和规则中的条件再次匹配,并且允许读取。


如果我们为所有访问规则添加另一个条件:

ref.where("access", "array-contains-any", [user_id, user_id+":R", "All_R"]);

然后,使用上面的规则,我们的权限再次被拒绝,因为我们在查询中有规则不知道的值。

要修复它,我们还会在规则中检查该值:

allow list: if request.auth != null && (
  request.auth.uid in resource.data.access || 
  request.auth.uid+":R" in resource.data.access ||
  "All:R" in resource.data.access
);

使用这些规则,查询再次成功。


此时,您可以在此处添加其他条件,它应该可以工作。

好了关于使用数组元素的FireBase身份验证规则的教程就到这里就结束了,希望趣模板源码网找到的这篇技术文章能帮助到大家,更多技术教程可以在站内搜索。