我有一个称为“读数”的顶级收藏。读数中的每个文档都有一个名为“ PatientUid”的字段。
我有以下安全规则:
service cloud.firestore {
match /databases/{database}/documents {
match /{document=**} {
allow read, write: if false;
}
//Takes a uid and returns true if it's the uid of the current user
function isTheUidOfCurrentUser(uid) {
return request.auth.uid == uid;
}
//A patient or one of their doctors can view their readings
match /readings/{reading} {
allow read, write: if isTheUidOfCurrentUser(resource.data.patientUid);
}
}
}
当前,如果用户正在阅读其中一个读数,则一切都很好,但是由于某种原因,用户无法创建读数。最奇怪的是,在尝试创建读数时,控制台中的模拟器甚至没有显示匹配的规则。
我在这里做错了什么。为什么该规则仅在读取时才匹配,而在写入时不匹配?
答案 0 :(得分:0)
问题在于resource.data在写发生之前代表了文档。因此,在创建文档时,resource.data没有PatientUid字段。
一旦我更改
resource.data.patientUid
到
request.resource.data.patientUid
之所以有效,是因为request.resource表示写入后文档将是什么。