【问题标题】:Compare Arrays / Sets in Firestore Security Rules比较 Firestore 安全规则中的数组/集
【发布时间】:2021-05-10 11:53:36
【问题描述】:

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

  • 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 

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

resource.data.members.toSet().difference(request.resource.data.members.toSet()) == request.auth.uid.toSet()

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

【问题讨论】:

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


    【解决方案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());
    }
    

    【讨论】:

    • 非常感谢:)
    猜你喜欢
    • 1970-01-01
    • 2020-12-28
    • 1970-01-01
    • 2018-10-19
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多