Cloud Firestore 中的规则如何级联?

Tri*_*ton 3 firebase firebase-security google-cloud-firestore

我正在尝试学习使用 Google Cloud Firestore 来存储和保护一些简单数据,因此我开始编写一些基本规则来验证从 API 传递的数据是否合理。

我最初的想法是每个规则都会被评估,如果任何一个规则失败,它就会使请求失败,但我发现请求和不匹配规则仍然成功。有人可以解释如何为子集合创建逐渐增强的安全规则吗?

这是我当前的规则集:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      allow write: if request.auth.uid != null;
    }
    match /projects {
      allow write: if resource.data.keys().hasAll(['title', 'description']);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

小智 5

在 Firestore 规则中,如果有任何allow批准请求,则允许该请求。allow应用于任何给定请求的语句都是match与资源名称匹配的块。

由于match /{document=**}模式与模式重叠match /projects,因此可以projects简单地通过身份验证来写入文档,例如request.auth.uid != null。这可能不是本意。

match /projects固定长度对匹配/databases/*/documents/projects,而match /{document=**}这开始于将匹配任何文档名称/databases/*/documents。的存在**表示零个或多个附加路径。

一般来说,避免match模式重叠是一种很好的做法。如果您需要编写一个匹配大多数事物但为特定路径创建例外的规则,则需要如下所示:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read;
      // allow writes to anything except the 'projects' document.
      allow write: if request.auth.uid != null
                   && /databases/$(database)/documents/$(document) 
                      != /databases/$(database)/documents/projects
    }
    match /projects {
      // allow _authenticated_ writes to the projects document if they
      // have the proper form.
      allow write: if request.auth.uid != null
                   && resource.data.keys().hasAll(['title', 'description']);
    }
  }
}
Run Code Online (Sandbox Code Playgroud)