我正在尝试保护一个用户可以在其中管理乐队的应用程序。用户可以属于多个乐队,因此可以根据他们所在的乐队而具有不同的角色。这些角色存储在“乐队”文档的“地图字段”中。
我目前具有以下firebase / firestore规则设置:
service cloud.firestore {
match /databases/{database}/documents {
function isSignedIn() {
return request.auth != null;
}
match /bands/{bandID}{
function isBandAdmin(userID){
// Determine if user is a band admin
return get(/databases/$(database)/documents/bands/$(bandID)).data.members[userID].role == 'Admin';
}
allow read, update, create: if isSignedIn() && isBandAdmin(request.auth.uid);
// Rules for a band's concerts
match /events/{event}{
allow read, update, create: if isSignedIn() && (isBandAdmin(request.auth.uid));
}
}
}
现在,如果我在Firebase控制台提供的模拟器中执行get请求,这将非常理想。但是在我的项目中,我试图执行以下请求:
database.collection("bands").where("name" ,"==", "AC/DC").get().then((docs) => {...});
这给了我一个权限错误。我该如何工作?
PS:我已经发布了类似的问题,但这是重要的更新。
答案 0 :(得分:1)
您似乎希望安全规则应过滤查询中与某些用户角色匹配的文档。这是行不通的,因为security rules are not filters。请仔细阅读链接的文档。
当您对多个文档执行查询时,安全规则应明确允许所有这些文档都被提取。它不会单独查看每个文档来确定是否允许阅读。如果规则系统确定不允许任何一个文档,则整个查询将失败。