防止 Firestore 规则中的重复条目不起作用

Maa*_*ers 7 firebase-security google-cloud-platform google-cloud-firestore

我正在尝试使用 Google Firestore 规则防止重复条目,但是它不起作用。我正在尝试的规则是:

service cloud.firestore {  
  // Prevent duplicate messages
  match /databases/{database}/documents {
    match /messages/{message} {
        allow read;
      allow write: if request.resource.data.m != resource.data.m;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

从我读到的,这应该有效。

在此处输入图片说明

我究竟做错了什么?

Fra*_*len 13

您的规则规定if request.resource.data.m != resource.data.m该字段m只能m 在与同一文档中的 field 的当前值不同时写入。

在安全规则中无法检查整个集合中的重复项,因为这需要 Cloud Firestore 读取集合中的所有文档(这在规模上会变得非常昂贵)。

当前实现唯一性约束的唯一方法是创建一个单独的集合,m用作文档 ID。由于集合中的文档 ID 根据定义是唯一的,因此您可以在那里强制执行规则:

match /unique_ms/{m} {
  allow create;
}
Run Code Online (Sandbox Code Playgroud)

以上只允许创建一个文档,它不允许更新它。这意味着一旦有人创建了具有特定值 的文档m,就没有人可以覆盖它。

使用该write规则的替代方法可能是:

allow write: if !exists(/databases/$(database)/documents/unique_ms/{m});
Run Code Online (Sandbox Code Playgroud)

另见: