繁体   English   中英

Firestore 安全规则中的数组比较

[英]Array comparison in Firestore security rules

用户需要能够将他们的 uid 添加到文档中称为“用户”的数组中。 他们应该只能添加/删除他们的 uid,而不是别的。

我需要编写一个安全规则来允许这样做,但无法弄清楚如何在安全规则中进行数组比较。

它需要是这样的:

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

这是查询:

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

这可能吗?

是的,这是可能的,:

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,您可以保证只有一项被添加到数组中。

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

所以它看起来很像这样。

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

希望这可以帮助。

arrays 上有一个removeAll方法用于数组排除。 看到这个答案

这里有一点 function 检查两个 arrays 是否因提供的元素而完全不同。

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)

编辑:经过几个小时的与类似任务的斗争,我决定在云 function 中进行。 如果这取决于其他文档的创建,或者您可以使用可调用的云函数,那么麻烦会少得多。

我写这个,我认为它对arrayUnion是安全的,它用于添加auth.uid但你可以为你的目标转换代码

function isOwnerUnionedInArray(arrayName) {
  let isCreating = resource == null;
  let resourceArray = resource.data.get(arrayName, []);
  let requestArray = request.resource.data[arrayName];
  let arrayDiff = requestArray.removeAll(resourceArray);

  return ((
      isCreating &&
      requestArray.size() == 1
    ) || (
      requestArray.size() == resourceArray.size() &&
      arrayDiff.size() == 0
    ) || (
      requestArray.size() == resourceArray.size() + 1 &&
      arrayDiff[0] == request.auth.uid
    )
  ) && request.auth.uid in requestArray;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM