激发存储规则以查看基于另一个集合中的文档值的集合,而不是预期的工作



我的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

最新更新