【问题标题】:Firebase authentication rules using array elements使用数组元素的 Firebase 身份验证规则
【发布时间】:2020-12-27 02:50:57
【问题描述】:

我正在使用带有 react native 的 Firebase。在我的应用程序中,我允许用户与特定用户或所有用户共享内容:读取、复制或修改权限。 由于 Firebase 没有为查询提供 OR 函数,所以我使用数组来存储 user:permission 组合,这样我就可以使用 array-contains-any 功能进行这样的查询

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

这使我可以查询由 user_id 拥有或共享给 user_id 或共享给具有 R、C 或 M 权限的“全部”的所有内容。

现在我想通过将经过身份验证的用户 ID 与数组中的用户 ID 进行比较,对身份验证规则执行类似的操作(以便只有具有“M”权限的用户可以修改等)。为了做到这一点,它需要类似于“array-contains-any”的功能和用于身份验证规则的字符串连接。

这可能吗,还是我需要做一些不同的事情?

【问题讨论】:

  • 您尝试过什么了吗?如果没有,这将是一个很好的起点:firebase.google.com/docs/firestore/security/rules-query
  • @FrankvanPuffelen 我看到了带有字段的身份验证规则示例,但没有看到数组。此外,我需要字符串连接和通配符来匹配数组中的 user_id 和权限。例如如果访问包含 request.auth.uid + ":M",则允许写入。缺少数组和字符串连接的例子让我觉得那样做是不可能的,我可能需要改变我的方法。

标签: javascript firebase google-cloud-firestore firebase-security


【解决方案1】:

我进行了一些测试,并认为我得到了您正在使用的类型的一个子集。我将逐步完成以下步骤,以便您在最后构建它。


第一步是使这个查询工作:

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
);

有了这些规则,查询又成功了。


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

【讨论】:

  • 谢谢,这行得通!顺便说一句,在我的应用程序中,“R”表示文档是只读的(不是所有者的用户,不能复制或更新它)。 “C”表示文档可以读取并复制到新文档,但不能更新(只有所有者可以更新),“M”表示文档可以读取、复制到新文档或更新。如果我错了,请纠正我,但 Firebase 规则可以帮助我获得读写权限,但应用程序需要确保不复制只读文档,即写入新文档或更新。是否有基于写入数据价值的规则?
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-08
  • 2020-05-10
  • 2018-08-25
  • 1970-01-01
  • 2019-01-20
  • 2021-01-22
相关资源
最近更新 更多