【问题标题】:Array comparison in Firestore security rulesFirestore 安全规则中的数组比较
【发布时间】:2019-08-06 14:25:07
【问题描述】:

用户需要能够将其 uid 添加到文档中名为“users”的数组中。他们应该只能添加/删除他们的 uid,没有别的。

我需要编写一个安全规则来实现这一点,但不知道如何在安全规则中进行数组比较。

它必须是这样的:

allow update: if request.resource.data.users == [...resource.data.users, request.auth.uid]

这是查询:

.update({
      users: firebase.firestore.FieldValue.arrayUnion(params.uid),
    })

这可能吗?

【问题讨论】:

    标签: javascript firebase firebase-security


    【解决方案1】:

    是的,有可能:

    allow update: if request.auth != null 
    && request.auth.uid in request.resource.data.users
    && request.resource.data.users.size() - resource.data.users.size() == 1
    

    request.resource.data.users 是建议更改后用户文档的状态,resource.data.users 是建议更改前文档的状态。通过检查差值是否为 1,您可以保证只有一项添加到数组中。

    【讨论】:

    • 这是不安全的。想象一下request.auth.uid=1request.resource.data.users = [1,2,3]resource.data.users = [1,2] 的情况。我们的用户(用户 1)可以将其他人的 ID(用户 3)添加到数组中。此外,这并没有让用户删除自己的 id。
    【解决方案2】:

    是的。可以检查安全规则中文档的数组字段中是否存在特定的uid。您可以使用in 条件进行检查。

    所以它看起来很像这样。

    allow update: if (request.auth.uid in request.resource.data.users);
    

    希望这会有所帮助。

    【讨论】:

    • 我需要它来检查是否只有他们的 uid 已添加到数据中。这只会检查他们的 uid 是否存在于新数据中。他们本可以添加更多的 uid,这是不允许的。不过谢谢。还没想好怎么弄!
    • @AJRiley 您无法检查使用 Firestore 规则添加另一个 uid 的情况。你可以在你的逻辑中处理它。但是你可以检查当前用户的uid是否在文档中不存在而在新文档中存在。
    【解决方案3】:

    数组上有一个removeAll 方法用于数组排除。见this answer

    这是一个小函数,用于检查两个数组是否完全因提供的元素而异。

    function arrDifferBy(arr1, arr2, el) {
                let diff12 = arr1.removeAll(arr2);
                let diff21 = arr2.removeAll(arr1);
                return diff12.length == 1 && diff21.length == 0 && diff12[0] == el || 
                    diff12.length == 0 && diff21.length == 1 && diff21[0] == el
    }
    

    在你的情况下,它会被用作

    allow update: if arrDifferBy(request.resource.data.users, resource.data.users, request.auth.uid)
    

    编辑:在我自己与类似的任务斗争了几个小时之后,我决定在云功能中完成它。如果这取决于创建其他文档,或者您可以使用可调用的云函数,那么麻烦会少得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-19
      • 2019-07-05
      • 1970-01-01
      • 2021-05-12
      • 1970-01-01
      • 2020-06-19
      • 1970-01-01
      相关资源
      最近更新 更多