Firebase安全规则未显示任何数据

时间:2020-07-29 09:29:30

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

我正在努力保护我的Firebase。

我做了这样的事情来保护我的用户列表。

rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
     match /about/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
match /avantages/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
match /blog/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
match /customers/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
match /lowersection/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
match /middlesection/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
match /topsection/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
    
match /users/{userId} {
allow read: if isOwner(userId);
allow write: if isOwner(userId);
}
}
function isOwner(userId) {
return request.auth.uid == userId;
 }
}

但是,一旦执行此操作,我的网站上就不会显示任何数据。

目标是使所有人(用户集合除外)都可以读取数据,但只有登录用户才能写入数据。

根据要求,下面是Angular应用程序中的代码,该代码允许它获取数据并发送回更新的数据。

getTopSectionMain() {
return   this.firestore.collection('topsection').doc('content').collection('main').snaps hotChanges();
}

updateTopSectionMain(dataID: any, data: any) {
this.firestore.doc('topsection/content/main/' + dataID).update(data);
}

这是来自我的内容服务。

任何帮助将不胜感激。

欢呼

1 个答案:

答案 0 :(得分:1)

您的问题似乎来自阅读子集合中的文档的事实。

让我们以topsection集合为例。您具有如下安全规则:

match /topsection/{id} {
    allow read: if true;
    allow write: if request.auth.uid != null;
}

但是您查询文档如下:

getTopSectionMain() {
    return   this.firestore.collection('topsection').doc('content').collection('main').snaps hotChanges();
}

这意味着您查询main集合中content文档的topsection子集合的文档。

doc中所述:“安全规则仅适用于匹配的路径,因此,在(父)集合上定义的访问控制不适用于(子)子集合。”

您需要通过添加recursive wildcard

来调整规则
match /topsection/{document=**} {
        allow read: if true;
        allow write: if request.auth.uid != null;
}

或指定每个子集合,例如:

match /topsection/{id} {
    match /main/{id} {
        allow read: if true;
        allow write: if request.auth.uid != null;
    }
}

由于您没有使用通配符来声明顶级集合的安全规则,因此最好使用第二个选项。