在Firestore中,我有一个存储多个对象的集合,这些对象由多个用户共享。 例如:
{
users: [uid1, uid2, uid3],
content: 'sample'
}
这三个用户都应该能够看到该文档。为此,我创建了以下规则:
service cloud.firestore {
match /databases/{database}/documents {
match /sharedDocs/{doc} {
allow read: if isMember(doc);
allow update: if isMember(doc);
}
function isMember(doc) {
return doc.indexOf(request.auth.uid) != -1;
}
}
}
我通过Angular(AngularFirestore模块)发送查询:
return this.db.collection('sharedDocs,
ref => ref.where('users', 'array-contains', uid)
).valueChanges();
不幸的是,此查询出现以下错误:
ERROR FirebaseError:缺少权限或权限不足。
答案 0 :(得分:0)
您可以编写一个安全规则,在其中可以使用数组进行验证。您可以使用in
条件来检查数组中是否存在特定值。
请考虑一个示例,其中需要限制使用现有的uniqueId创建新文档,即,如果用户已经使用相同的uniqueId
创建了文档,并且其uniqueId存在于{{ 1}}在其用户文档的createdDocs
集合中。
Users
针对您的特定情况尝试以下操作:
service cloud.firestore {
match /databases/{database}/documents {
match /Docs/{uniqueId}{
//Only restricting new docs
allow create: if (! uniqueId in getUserData(request.resource.data.userId).createdDocs);
}
//Function to get the user information
function getUserData(userId){
return get(/databases/$(database)/documents/Users/$(userId)).data;
}
}
}
注意:请确保您在应用程序中进行了相同的检查,因为已知Firestore安全规则模拟器存在一些问题。
希望这会有所帮助。