我正在努力保护我的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);
}
这是来自我的内容服务。
任何帮助将不胜感激。
欢呼
答案 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;
}
}
由于您没有使用通配符来声明顶级集合的安全规则,因此最好使用第二个选项。