Firebase规则:组和.where()中基于角色的身份验证存在问题

时间:2019-07-22 10:27:33

标签: javascript firebase google-cloud-firestore firebase-security-rules

我正在尝试保护一个用户可以在其中管理乐队的应用程序。用户可以属于多个乐队,因此可以根据他们所在的乐队而具有不同的角色。这些角色存储在“乐队”文档的“地图字段”中。

我目前具有以下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:我已经发布了类似的问题,但这是重要的更新。

1 个答案:

答案 0 :(得分:1)

您似乎希望安全规则应过滤查询中与某些用户角色匹配的文档。这是行不通的,因为security rules are not filters。请仔细阅读链接的文档。

当您对多个文档执行查询时,安全规则应明确允许所有这些文档都被提取。它不会单独查看每个文档来确定是否允许阅读。如果规则系统确定不允许任何一个文档,则整个查询将失败。