仅在Firebase中从根文档获取数据

仅在Firebase中从根文档获取数据,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我有一个连接到云Firestore的angular应用程序,我仍在努力解决如何指定规则。到目前为止,我有一个用户是厨房的用例,这是一个学生宿舍的应用程序,这意味着可以有X个用户,每个厨房一个,我有以下规则: service cloud.firestore { match /databases/{database}/documents { match /{document=**} { //Only allow authenticated users to read

我有一个连接到云Firestore的angular应用程序,我仍在努力解决如何指定规则。到目前为止,我有一个用户是厨房的用例,这是一个学生宿舍的应用程序,这意味着可以有X个用户,每个厨房一个,我有以下规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      //Only allow authenticated users to read
      allow read: if request.auth != null;
    }
    match /kitchens/{userId}/{document=**} {
      // Only the kitchen that is logged in can write to its own data
      allow write: if request.auth.uid == userId;
    }
  }
}
问题是,由于有一定数量的厨房,注册屏幕允许用户从下拉列表中选择要注册的厨房。然后根据尚未注册的厨房id筛选列表,因此我需要读取厨房id的权限。我只是不想让任何人,除了厨房自己去阅读属于厨房的数据。我试过:

match /kitchens/{id=**} {
  // Unauthenticated users can read kitchens
  allow read: if true;
}
但是通过邮递员发送一个http请求只会给我厨房里所有我想要的东西。
那么,有没有一种方法可以只读取根文档的字段而不读取根文档中包含的任何集合,这样我就可以看到哪些厨房已经注册了,但厨房的住户却没有

这部分规则给您带来了麻烦:

match /{document=**} {
  //Only allow authenticated users to read
  allow read: if request.auth != null;
}
您可能认为它只影响根文档,但实际上影响所有文档。该**将在任何深度匹配任何文档。有了这个规则,任何经过身份验证的用户都可以读取数据库中的每个文档

您应该删除此规则,并将其替换为更具体地满足您的需求的规则

您在这里遇到了类似的问题:

match /kitchens/{id=**} {
  // Unauthenticated users can read kitchens
  allow read: if true;
}
这样,任何人都可以阅读kitchens集合,以及子集合中的*所有**嵌套文档。同样,这就是**通配符的工作原理

如果要将匹配限制为仅一个集合,请不要使用这些贪婪的通配符。只需使用仅与直接子集合中的文档匹配的普通文档:

match /kitchens/{id} {
  // Unauthenticated users can read kitchens
  allow read: if true;
}

您可能需要查看有关的文档。

通配符的名称无关紧要。你想用什么就用什么。如果您有后续问题,请将其作为单独的问题发布。