当前位置: 首页 > 知识库问答 >
问题:

Firestore安全规则:基于父文档权限查询子集合

东郭鹤龄
2023-03-14

假设我有一个餐厅集合,其中包含菜单子集合。餐厅权限设置在餐厅文档中,如下所示:

餐馆

{
 "roles": {
    "user123": "Owner"
  }
}

任何有权访问餐厅的人也可以访问它的任何子集合,包括菜单子集合。这是安全规则:

安全规则

match /restaurants/{restaurantId}/{document=**} {
  allow read: if resource.data.roles[request.auth.uid] > '' ;
}

查询餐厅列表可以这样完成,而且效果很好:

查询餐厅

firebase
      .firestore()
      .collection('restaurants')
      .where(`roles.${uid}`, '>', '');

现在如何查询菜单子集合?我知道Firestore需要根据查询推断权限,而不查看底层数据。从逻辑上讲,这应该是可能的,因为任何可以访问餐厅的人也可以访问菜单子集合。但是我如何组合这个菜单子集合查询,以便Firestore可以推断出这一点呢?我能提出的最符合逻辑的查询如下:

查询菜单子集合(不工作)

firebase
     .firestore()
     .doc(`restaurants/${restaurantId}`) // user has access to this restaurant
     .collection('menus');

...但这在许可被拒绝的情况下是行不通的。

共有1个答案

姬振濂
2023-03-14

事实证明,我需要在餐厅级别创建两条安全规则,以实现我的目标:

    match /restaurants/{restaurantId} {
      allow read: if resource.data.roles[request.auth.uid] > ''
    }

    match /restaurant/{restaurantId}/{document=**} {
      allow read: if get(/databases/$(database)/documents/restaurants/$(restaurantId)).data.roles[request.auth.uid] > '';
    }

为了查询用户有权访问的餐厅,第一条规则是必需的。仅第二个问题是行不通的,尽管我不知道为什么。这是对第一条规则的查询:

firebase
      .firestore()
      .collection('restaurants')
      .where(`roles.${uid}`, '>', '');

第二条规则对于所有子集合查询都是必需的。下面是一个例子:

firebase
      .firestore()
      .collection(`restaurants/${restaurantId}/menus`);

第二条规则允许子集合查询的事实非常有趣,因为FiRecovery需要读取Restaurant文档才能允许此查询。这与其声称它不查看查询的底层数据的说法相矛盾,但如果它只需要读取路径中的一个文档,它看起来就像是这样。

 类似资料:
  • 问题是我不能使用具有这些规则的查询,因为(我发现)无法根据子集合是否包含某个文档进行查询。这意味着我不能列出某个用户所属的所有组。我尝试在作为一部分的映射中列出所有用户,但我无法设置谁可以编辑文档的某些部分的权限,因此这也不起作用。 编辑:据我所知,查询必须以某种方式与规则匹配,否则权限将被拒绝。如何创建一个查询来收集某个用户所在的所有组并满足此规则。

  • 为了查询子集合和父文档,我对firest的文档及其最佳实践有一些问题。我试图使用Typecript在我的Firebase函数中进行查询。 DB: ├── 用户(集合) │ └── 用户(ID为的文档) │ │ └── 计划(子集合) 我有一个数组中的用户ID列表,我需要从用户文档和当前文档的子集合计划中收集信息。 但是如何从用户文档和子集合(计划)文档(当前)中获取数据,我不知道在场景中最有效的查

  • 我在Cloud Firestore中有以下简化的数据模式: 我现在想向用户展示他团队的所有“待办事项”文档,我不知道什么是最好的方法。 1. 集合组查询 - 按团队 ID 查询 为此需要两个查询。每个待办事项文档都可以具有父团队 ID,并通过集合组查询进行检索,例如 - 到目前为止,这对我来说似乎是最好的解决方案,但缺点是“IN”查询限制为10个值 https://firebase.googleb

  • 我的Firestore数据库有一些用户和一些s。如果没有其他人认领,用户可以认领。他们通过在上创建一个文档来声明,该文档有一个名为的字段,该字段是对他们自己的用户文档的引用。 我想我已经在这些安全规则中捕捉到了: 但是,当为所有权删除文档时,我获得了: 我是这样做的: 如果我打开read和write设置为true的文档,就不会出现此异常。 我的规则怎么了?他们用模拟器测试正常。

  • 我有文档,其中包含子集合。现在,我想获取子集合中至少有一项的所有项目。这可能吗? 类似于: < code>getDocs(collection(getDB()," Projects)),其中(" Items.size ","

  • 我没主意了。希望新的眼光能有所帮助。 我有以下安全规则: 我正在下面的代码中设置文档: 我简直想不通。任何帮助都将不胜感激。