Firestore返回的权限不足,甚至不应该这样做

时间:2019-11-27 17:55:41

标签: javascript google-cloud-firestore firebase-security

我为Firestore数据库设置了以下规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /collections/{document=**} {
        allow read;
        allow write: if isAdmin();
        }

    match /general/{document=**} {
        allow read;
        allow write: if isAdmin();
        }

    match /inquiries/{document=**} {
        allow write;
        allow read: if isAdmin();
        }

    match /orders/{document=**} {
        allow write;
        allow read: if isAdmin() || resource.data.userID == request.auth.uid;
        }

    match /products/{document=**} {
        allow read;
        allow write: if isAdmin();
        }

    match /users/{userId} {
        allow write, read: if belongsTo(userId);
        }

    function belongsTo(userId) {
        return request.auth.uid == userId
        }

    function isAdmin() {
        return resource.data.admin == true;
    }
  }
}

如您所见,每个人都可以阅读/ products及其文档以及子集合。哪个适用于产品,但无法读取产品的子集合(每个产品都有一个名为collection-colors的子集合)。

  

FirebaseError:缺少权限或权限不足。

导致错误的代码:

retrieveCollectionColors(name) {
    this.db.collectionGroup('collection-colors', ref => ref.where('product', '==', name))
      .valueChanges().subscribe( (val: []) => {
      this.collectionColors.next(val);
    }, error => {
      console.log(error);
    });
}

1 个答案:

答案 0 :(得分:1)

您现在拥有的规则根本不适用于收藏组查询。您需要为此编写一条特殊规则。来自documentation

  

基于收集组保护和查询文档

     

在安全规则中,您必须明确允许收集组   通过为收集组编写规则进行查询:

     
      
  • 确保rules_version ='2';是规则集的第一行。集合组查询需要新的递归通配符{name=**}   安全规则版本2的行为。
  •   
  • 使用match /{path=**}/[COLLECTION_ID]/{doc}为您的收藏组编写一条规则。
  •   

因此,如果您要允许对“ collection-colors”进行收集组查询,它将看起来像这样:

match /{path=**}/collection-colors/{doc} {
  allow read: ...
}

这将应用于具有给定名称的所有子集合。您不能根据父集合的名称有选择地允许或禁止子集合。