具有 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
文档中。
我想删除我的 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
文档中。