【问题标题】:See Array Changes in Firestore Security请参阅 Firestore 安全性中的阵列更改
【发布时间】:2020-08-15 02:41:03
【问题描述】:

我有一个集合reviews,其中每条评论都包含uids 喜欢它的用户列表,称为likes。架构如下所示:

  • 评论(收藏)
    • 标题string
    • 作者uid
    • 点赞 [uid]
    • 发帖timestamp
  • 用户(收藏)-uid
    • 已创建timestamp
    • 电子邮件string

目前,我正在处理喜欢评论的用户:

    firebase.firestore().doc(rid).update({
      likes: firebase.firestore.FieldValue.arrayUnion(this.fetchCurrentUID())
    });

并且不喜欢:

    firebase.firestore().doc(rid).update({
      likes: firebase.firestore.FieldValue.arrayRemove(this.fetchCurrentUID())
    });

我只想让用户在likes 中添加或删除他们自己的uid

如何编写安全规则来确保这一点?具体来说,我需要查看 列表是如何更新的,例如:

let newVals = request.resource.data.new_values // or something
return (newVals.length == 1 && newVals[0] == request.auth.uid)

【问题讨论】:

  • 请编辑问题以更具体。显示您正在使用的特定客户端请求、您正在使用的文档结构,以及您已经尝试过但未按预期方式工作的更完整的安全规则。
  • @DougStevenson 完成!但是,我不确定您所说的“您已经尝试过但未按预期方式工作的安全规则”是什么意思,因为在这种情况下,我有一个我不知道该怎么做的特定操作。跨度>
  • 在 Stack Overflow 上,您应该尝试解决问题,这有助于阐明您正在尝试做什么,以及您如何考虑可能的解决方案。
  • @DougStevenson 请解释我在哪里可以更好地“解决问题”,或者问你仍然不明白的地方。人们可能会遍历新旧数组中的每个值并查看它们的不同之处,但根据stackoverflow.com/a/49227926/7834942,firestore 不提供安全规则中的迭代。 Firestore 安全规则非常不灵活,很难尝试一起破解。
  • @Néstor 有一个解决方法,您可以将所有关系放在他们自己的集合或子集合中,即具有字段:用户,user_likes_content _id 然后对于添加到集合中的每个添加元素,规则变得很容易执行.然而,对于大小为 n 的数组,我们将执行 n 次 DBS 读取以获取数组,而不是 1。

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


【解决方案1】:

我们可以检查最终结果,而不是检查我们正在更新的arrayUnion 的值。

request.resource.data.likes 是应用arrayUnion 之后的数组。

因此喜欢应该导致request.auth.uid in request.resource.data.likes == true
对于不喜欢我们否定它!(request.auth.uid in request.resource.data.likes) == true

这很容易,因为我们可以访问request.auth.uid,但在我们无法通过这种方式访问​​假定值的情况下。以下答案有一个解决方案: Firebase security rules, ensure one "array remove" only, and only to userId

它使用以下技巧 - 创建与removeAll 的数组交集:

resource.data.likes.removeAll(request.resource.data.likes)[0] == request.auth.uid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 2016-12-19
    • 2018-03-27
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多