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

Javascript Firebase规则:组和.where()中基于角色的身份验证存在问题,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,我正在尝试保护一个应用程序,用户可以在其中管理他们的乐队。用户可以是多个波段的一部分,因此根据他们所在的波段,可以具有不同的角色。角色存储在Band文档的映射字段中 我目前有以下firebase/firestore规则设置: service cloud.firestore { match /databases/{database}/documents { function isSignedIn() { return request.auth != null; }

我正在尝试保护一个应用程序,用户可以在其中管理他们的乐队。用户可以是多个波段的一部分,因此根据他们所在的波段,可以具有不同的角色。角色存储在Band文档的映射字段中

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

看起来您希望安全规则应该过滤查询中与某个用户角色匹配的文档。这是行不通的,因为。请仔细阅读链接文档


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

看起来您希望安全规则应筛选查询中与某个用户角色匹配的文档。这是行不通的,因为。请仔细阅读链接文档


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

用户可能未登录,或者不是管理员。鉴于你提供的信息,很难说是哪一个。要确定用户是否已登录,请在运行查询之前立即登录firebase.auth().currentUser。这不是问题所在。用户已登录,同时也是管理员。下面的答案是正确的。看起来用户不是没有登录,就是不是管理员。鉴于你提供的信息,很难说是哪一个。要确定用户是否已登录,请在运行查询之前立即登录firebase.auth().currentUser。这不是问题所在。用户已登录,同时也是管理员。下面的答案是正确的。好的!我期待着这样的回答。非常感谢:)好的!我期待着这样的回答。非常感谢:)