具有集合组资源数据的Firebase Firestone规则



我想删除Firestore数据库中的所有学生,为此我使用了集合组但我在规则方面遇到了问题:我无法实现对读取、删除和amp;更新权限。

代码

以下是Flutter中的dart代码,用于检索任何嵌套集合中的所有学生并将其删除:

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
}

我的数据库

classes/CLASS_ID/(学生:集合,名称:string…(

users/USER_ID/(classIds:数组,firstName:字符串…(

安全规则不过滤数据,而只是确保您执行的操作得到授权。请参阅有关规则不是筛选器的文档。

由于isClassBelongToUser检查要求用户存在于特定文档的classIds中,因此查询也必须确保满足此条件。由于Firestore只能过滤它返回的文档中的值,因此不幸的是,这样的条件是不可能的。

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

最新更新