首页 > 解决方案 > 嵌套的 firebase-firestore 规则:父文档中的所有者 ID

问题描述

我无法让这些规则起作用:我有一个包含项目的集合,它们都有一个所有者。应该允许所有者读/写他的项目和子集合 working_copies。

此实现成功地允许读取项目,但在从子集合中读取 working_copy 时失败(缺少或权限不足)。我怀疑它试图在子文档中找到所有者。

service cloud.firestore {

  match /databases/{database}/documents {

    match /projects/{projectId} {
      allow read, write: if 
        resource.data.owner == request.auth.uid;

      match /working_copies/{doc} {
        allow read, write: if true;
      }

  }
}

我也尝试在项目路径或 working_copies 路径中使用此条件,但它也都失败了:

    get(/databases/$(database)/documents/projects/$(projectId)).data.owner == request.auth.uid

当我使用递归通配符进行嵌套时,上述所有内容也会失败:

match /projects/{projectId=**} {
   ...

奇怪的是,我认为第一个版本直到几天前才可以使用。

我使用 angular/angularfire 并像这样调用请求:

 this.db.collection('projects').doc('3279').collection<ProjectData>('working_copies').valueChanges().pipe(...

在规则模拟器中,它是绿灯。

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


我终于找到了解决方法:

!('owner' in resource.data) || resource.data.owner == request.auth.uid

这使它接受子文档不再提供所有者。所以看起来,当嵌套规则时,父规则也适用于子文档。


推荐阅读