首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >仅在Firebase中从根文档中获取数据

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

Stack Overflow用户
提问于 2019-12-19 21:56:29
回答 1查看 75关注 0票数 0

我有一个角度应用程序连接到,我仍然在尝试如何指定规则。到目前为止,我有一个用户是厨房的用例(这是一个学生宿舍的应用程序),这意味着可以有X个用户,每个厨房一个,我有以下规则:

代码语言:javascript
复制
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。我只是不想让任何人,只有厨房自己才能读取属于该厨房的数据。我试过:

代码语言:javascript
复制
match /kitchens/{id=**} {
  // Unauthenticated users can read kitchens
  allow read: if true;
}

但是向邮递员发送http请求只会给我所有我想要的厨房下面的东西。

那么,是否有一种方法只能够读取根文档的字段,而不能读取根文件中包含的任何集合,这样我就可以看到哪些厨房已经注册,而不是厨房的居民?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-19 23:53:06

规则的这一部分给你带来了麻烦:

代码语言:javascript
复制
match /{document=**} {
  //Only allow authenticated users to read
  allow read: if request.auth != null;
}

您可能认为它只影响“根”文档,但实际上影响到所有的文档。该**将在任何深度匹配任何文档。有了这个规则,任何经过身份验证的用户都可以读取数据库中的每个文档。

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

您在这里也有类似的问题:

代码语言:javascript
复制
match /kitchens/{id=**} {
  // Unauthenticated users can read kitchens
  allow read: if true;
}

这允许任何人阅读厨房集合,以及*所有**嵌套文档在子集合中。同样,这就是**通配符的工作方式。

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

代码语言:javascript
复制
match /kitchens/{id} {
  // Unauthenticated users can read kitchens
  allow read: if true;
}

您可能需要查看有关递归通配符的文档。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59417373

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档