如何列出用户可以从Firestore集合中读取的所有文档?

时间:2019-02-13 10:31:18

标签: firebase firebase-authentication google-cloud-firestore google-cloud-functions

如何获取当前用户具有读取权限的集合中的所有文档?

尝试获取所有文档会导致权限错误,因为它包括尝试读取用户没有权限的文档(而不是返回过滤后的文档列表)。

此应用程序中的每个用户都可以属于多个组。读取被锁定到已添加到的组。

match groups/{group} {
  allow read: if exists(/databases/$(database)/documents/groups/$(group)/users/$(request.auth.uid));
}

这就是假设的subcollection-contains-id运算符的外观。

firestore()
  .collection("groups")
  .where("users", "subcollection-contains-id", user.uid);

作为临时的解决方法,我已将此逻辑移至云功能。这是其工作方式的简写。

for (let group of firestore().collection("groups")) {
  let user = firestore.doc(`groups/${group.id}/users/${uid}`);

  if (user.exists) {
    // Send this group id to the client
  }
}

如何在不放松安全规则的情况下将这些问题放在一起,并将这种逻辑转移到客户端?

1 个答案:

答案 0 :(得分:1)

您可以在集合内的文档中添加owners字段

owners: ["uid1", "uid2"]

然后,您可以使用array_contains

搜索来获取所有带有uid的帖子

ref.where("owners", "array-contains", uid)

在规则中,您可以添加以下内容:

allow read: if request.resource.data.owners.hasAny([request.auth.uid]) == true

allow update: if request.resource.data.owners.hasAny([request.auth.uid]) == true