我的Firestore中有一个名为"Facilitators"的集合。这为经过身份验证的用户保存了附加信息。
我想制定一条规则,规定如果"促进者"集合中的文档中的字段标记为"是",他们可以阅读另一个名为"孩子"的集合。
促进者集合中的文档使用经过身份验证的用户电子邮件作为文档id,因此我希望规则会检查该集合中文档id与用户电子邮件匹配的文档,然后检查该文档中的特定字段是否标记为"是"。
如果它被标记为"是",我想允许他们阅读名为"孩子"的收藏。
我希望这是有意义的,这是我目前实现这一目标的规则,但它并没有像预期的那样起作用:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /Facilitators/{facilitators} {
function kids() {
return request.auth.email == resource.data.email && resource.data.BeAHero == "Yes";
}
function teens() {
return request.auth.email == resource.data.email && resource.data.YouAreUnstoppable == "Yes";
}
match /Kids/{kids} {
allow read: if kids();
}
match /Teens/{teens} {
allow read: if teens();
}
}
}
}
当您阅读Kids集合中的文档时,resource.data
将包含Kid文档的数据,而不是协导员的数据。如果您想读取建导师文档中的字段,则必须使用get()
函数读取该文档的数据,如下所示:
function kids() {
return get(/databases/$(database)/documents/Facilitators/$(request.auth.token.email)).data.BeAHero == "Yes";
}
此外,要获得请求用户的电子邮件,您必须使用request.auth.token.email
,而不仅仅是request.auth.email
。