比较 Firestore 安全规则中的数组/集合

时间:2021-05-10 11:53:36

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

在我的用例中,文档由特定组的多个用户处理。 该文档包含(除了其他条目)两个相关字段:

  • ownerUID(字符串值 - 代表文档所有者的 UID)
  • members(字符串数组 - 表示允许处理此文档的所有成员的 UID)

我想确保(使用安全规则),(除了文档的所有者)没有成员能够从 members 数组中删除另一个成员 - 除了他们自己。

为了评估这一点,我尝试在我的 Firestore Security Rules

中使用以下函数
function onlyOwnMemberUIDRemovableOrOwner(){
        return request.auth.uid == resource.data.ownerUID ||
               resource.data.members.toSet().difference(request.resource.data.members.toSet()) == request.auth.uid.toSet();
}

第一条语句非常明显,并且适用于我设置中的其他规则,允许 owners 无限制地修改文档:

request.auth.uid == resource.data.ownerUID 

第二个语句给我带来了问题。这个想法是,通过使用 members.difference() 函数评估 sets 字段中的缺失值,并将其与仅包含自己的 {{1} }.仅当缺少的 set 是自己的 UID 时,函数才应返回 UID。不幸的是,即使尝试删除自己的 UID,该语句仍将返回 true

UID

你能告诉我我在这里做错了什么吗? 您知道解决问题的更好方法吗? 非常感谢您的支持。

1 个答案:

答案 0 :(得分:1)

您的代码有两个问题:

  1. toSet() 适用于 list 而不适用于 string
  2. 您必须确保 ownerUID 未被修改

这里是更正的规则:

function onlyOwnMemberUIDRemovableOrOwner(){
  return request.resource.data.ownerUID == resource.data.ownerUID
    && (request.auth.uid == resource.data.ownerUID ||
      resource.data.members.toSet().difference(request.resource.data.members.toSet()) == [request.auth.uid].toSet());
}