【问题标题】:Firebase Firestore, can you have multiple update rules for a collectionFirebase Firestore,您可以为一个集合设置多个更新规则吗
【发布时间】:2020-09-08 15:05:54
【问题描述】:

我继承了一个项目,但在尝试更新特定集合的属性时遇到权限问题。

查看已设置的 Firestore 规则,它列出了多个 update 规则,我想知道,这是否允许?我尝试在 Firebase 中使用规则游乐场,但我收到一条错误消息,告诉我其中一条规则没有定义 name 属性,这是正确的,因为我没有更新 name财产。然后 Firebase 会跳过该规则并转到下一个规则以查看它是否适用?

供参考,收集规则如下;

match /teams/{id} {
      allow read:   if request.auth.uid != null
                    && request.auth.uid in resource.data.members;

      allow read: if isAdmin();

      allow create: if true;

      allow update: if request.auth.uid != null
                    && request.resource.data.keys().hasOnly(['name', 'owners', 'members'])
                    && request.resource.data.name is string
                    && request.resource.data.name.size() >= 1
                    // ToDo: Validate values in list
                    && request.resource.data.owners is list
                    && request.resource.data.owners.size() >= 1
                    // ToDo: Validate values in list
                    && request.resource.data.members is list
                    && request.resource.data.members.size() >= 1
                    && request.auth.uid in resource.data.owners;

      allow update: if request.auth.uid != null
                    && request.resource.data.keys().hasOnly(['name', 'owners', 'members'])
                    && request.resource.data.name == resource.data.name
                    && request.resource.data.owners == resource.data.owners
                    // ToDo: Validate values in list
                    && request.resource.data.members is list
                    && request.resource.data.members.hasAll(resource.data.members)
                    && exists(path('/databases/' + database + '/documents/subinvites/' + request.auth.uid + id));

      allow update: if isAdmin();
    }

我正在尝试像这样更新team 集合上的members 属性;

Firebase.firestore()
    .collection("teams")
    .doc(teamId)
    .update({
        members: Firebase.firestore.FieldValue.arrayUnion(userId),
    });

但是,看看上面的规则和代码,这肯定行不通,因为两个更新角色似乎都要求请求包含 nameownersmembers,其中作为请求只通过members。这也意味着如果name 属性,则条件request.resource.data.name == resource.data.name 不可能为真

【问题讨论】:

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


    【解决方案1】:

    它列出了多个更新规则,我想知道这是否允许?

    是的,您可以为特定的访问方法设置多个规则。

    Firebase 是否会跳过该规则并转到下一个规则以查看它是否适用?

    没有跳过任何规则。如果您有多个规则,它将计算每个规则的逻辑 OR。因此,如果任何规则允许更新,则授予该访问权限。

    如果 name 属性,条件 request.resource.data.name == resource.data.name 不可能为真

    不一定。如果文档在更新之前有一个name 字段,那么它将在此处具有该值。 request.resource.data 包含正在写入的新文档的整个 内容,而不仅仅是更新中指定的字段。但是,如果该字段不存在,并且您没有在更新中提供一个,那么规则将拒绝更新。

    【讨论】:

    • 这完美地解释了一切。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2018-10-23
    • 2019-11-03
    • 2020-02-25
    • 2018-08-09
    • 2019-09-08
    相关资源
    最近更新 更多