Firestore 规则 if..else

Chr*_*now 8 firebase firebase-security google-cloud-firestore

我刚刚开始了解 Firestore 规则,而且我的头脑正在迅速扩大。

我正在尝试研究如何将规则应用于一个集合,并将另一条规则应用于所有其他集合及其子集合。

所以我从 Firestore 似乎附带的默认规则开始:

service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

这将允许对所有集合及其文档进行读写访问。

但是假设我想对一个集合中的文档应用规则并保留所有其他集合的默认规则。以下将不起作用:

service cloud.firestore {
  match /databases/{database}/documents {

      match /suppliers/{supplier} {
        allow create: if !exists(/databases/$(database)/documents/supplierABNs/1260)
}

  match /{document=**} {
    allow read, write;
}


 }
}
Run Code Online (Sandbox Code Playgroud)

因为第二条规则将覆盖第一条规则。

有没有办法做我想做的事?

Rah*_*ram -2

service cloud.firestore {
  match /databases/{database}/documents {

    match /suppliers/{supplier} {
      allow create: if isValidSupplier()
    }

    function isValidSupplier() {
        return resource.data.supplierABNs == '1260'
    }

    match /{document=**} {
      allow read, write;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

Resource.data 包含现有文档中的值。

  • 但第二条规则不会仍然优先于第一条规则吗? (2认同)
  • 这就是为什么我在标题中包含“if..else”。我希望能够说,如果第一个匹配项为真,则不要应用第二个匹配项。 (2认同)