具有 collection 组资源数据的 Firebase Firestore 规则

Firebase Firestone rules with collection group ressource data

我想删除我的 Firestore 数据库中的所有学生,为此我使用了 collection 组 但我有规则问题:我无法实现授权读取、删除和更新权限。

代码

这是 Flutter 中的 dart 代码,用于检索任何嵌套 collection 中的所有学生并删除它们:

FirebaseFirestore.instance
  .collectionGroup('students')
  .where('studentId', isEqualTo: studentId)
  .get()
  .then((querySnapshot) async {
    for (var snapshot in querySnapshot.docs) {
      await snapshot.reference.delete();
    }
  }
});

规则

我使用的规则不起作用,因为似乎resource.data.classId无法访问...

function isClassBelongToUser(classId) {
  return classId in get(/databases/$(database)/documents/users/$(request.auth.uid)).data.classIds
}

match /{path=**}/students/{id} {
  allow read, delete, update: if isSignedIn() && isClassBelongToUser(resource.data.classId); // TODO: resource.data.classId seems to not work
}

我的数据库

类 / CLASS_ID / (学生:collection,姓名:字符串, ...)

users / USER_ID / (classIds: array, firstName: string, ...)

安全规则不会过滤数据,而只是确保您执行的操作是经过授权的。请参阅 rules are not filters.

上的文档

由于您的 isClassBelongToUser 检查要求用户存在于特定文档的 classIds 中,因此您的查询也必须确保满足此条件。由于 Firestore 只能过滤文档中的值 returns,很遗憾,这种情况是不可能的。

您必须调整您的数据模型以允许用例,例如将必要的信息复制到 students 文档中。