读取集合中的所有文档有规则的功能吗?

时间:2019-04-15 13:28:21

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

在为Firestore项目设置规则时遇到一些麻烦。我尝试学习数据库设置,但是找不到任何解决方案。因此,当我尝试从集合“列表”中获取文档时没有问题。但是,当我尝试获取集合“列表”中的所有文档时,xcode告诉我“缺少权限或权限不足”。 我的目标是让用户能够在“列表”集合中创建文档,但他们只能读取出现在文档数组“成员”中的“列表”中的文档。

现在,我可以毫无问题地将文档添加到collection(“ lists”)中,但是我看不到它们。我只能从具有特定目标的xcode逐一读取它们。

有任何提示或想法吗?

service cloud.firestore {
  match /databases/{database}/documents {

  match /{documentId} {
    allow read: if request.auth.uid != null;
  }

   match /lists/{docId} {
     allow write: if request.auth.uid != null;

     allow read: if request.auth.uid in resource.data.members
  }
 }
}

Xcode。

//working
let docRef = db.collection("lists").document("j0hHA5TLPETf6JRMbC1s")
        docRef.getDocument { ...


//not working due to permission failed
db.collection("lists").getDocuments() { ...

2 个答案:

答案 0 :(得分:2)

您的规则不起作用,因为它假设该规则将过滤掉所有不符合该规则的文档。这不是安全规则的工作方式。 Security rules are not filters.从链接的文档中:

  

在编写查询以检索文档时,请记住安全性   规则不是过滤器-查询全部或全部。为了节省您的时间,   资源,Cloud Firestore根据潜在查询评估查询   结果集,而不是所有您的实际字段值   文件。如果查询可能返回文档,   客户端没有读取权限,整个请求失败。

客户只能请求满足规则的文件。现在,该查询正在询问列表集合中的所有文档,而不管客户端是否有权访问它们。这将使安全规则失败,因为它试图读取它无权访问的文档。

您需要做的是使查询仅请求用户可读的文档。这意味着您可能应该在客户端上使用array-contains filter来仅匹配规则允许其读取的文档。

答案 1 :(得分:0)

实际上,您走在正确的道路上,我认为,如果您这样更改代码,它将可以正常工作。

代替此:

match /{documentId} {
    allow read: if request.auth.uid != null;
  }

使用此:

match /lists {
     allow read: if request.auth.uid != null;
  }

因此,当您尝试不使用lists访问documentId时,它将检查auth.uid

但是,当您尝试访问ex文件时。 lists/1,它将检查该用户是否存在于数组中。