Firestore规则get()在模拟器中有效,但在应用程序中无效

埃里亚·基亚鲁奇(Elia Chiarucci)


我正在尝试制定一个Firestore规则,该规则将检查用户是否是“父”集合的所有者。

我有这样的结构:


   -> [饮食]
        文档的集合->(所有者:“所有者”)
                      | 
   subCollection-> [Food]
        文档->(名称:“ Carrot”)

我希望可以使用[Diet]文档的doc属性在[Food]子集合中读写文档。


此版本有效,但它仅检查请求的源,而不总是检查[Diet]。

rules_version = '2';
service cloud.firestore {
    match /databases/{database}/documents{
        match /diets/{id}/{id2=**} {
            allow read, write: if resource.data.owner == request.auth.uid;
        }
    }
}


即使父级(Diet doc本身)是请求的来源,此版本也无法使用。检查饮食中的DOC时,该解决方案是否应该与先前的解决方案相同?

rules_version = '2';
service cloud.firestore {
    match /databases/{database}/documents{
        match /diets/{id}/{id2=**} {
            allow read, write: if get(/databases/$(database)/documents/diets/$(id)).data.owner == request.auth.uid;
        }
    }
}

在检查Diet文档时,该解决方案是否应该与上一个解决方案相同?

它可以在模拟器中运行,即使请求子集合文档,也一切正常,但是我的应用程序出现“ FirebaseError:缺少权限不足”错误。


这是我的应用程序的代码。

firebase.firestore().collection("diets").where("owner", "==", this.userID).get()
.then(function(querySnapshot) {
    querySnapshot.forEach(function(doc) {
        console.log(doc);
        console.log(doc.id, " => ", doc.data());    
    });
})
.catch(function(error) {
    console.log("Error getting documents: ", error);
});
道格·史蒂文森

控制台模拟器只能模拟单个文档的获取。当前无法模拟集合查询,这些查询的处理方式不同。

您遇到的问题是安全规则不是筛选器我强烈建议您阅读该文档以及本文您的第一个规则起作用的原因是,该规则可以非常轻松地检查查询的过滤器是否匹配规则中返回的所有可能文档的约束。查询不可能要求的内容超出规则明确允许的范围。但是,当您涉及时get(),该规则将不会对get()集合中的每个文档进行评估,因为对于大型集合而言,这将非常慢。它不会尝试通过检查get()每个文档的结果来过滤文档

该规则适用于单个文档,因为它不涉及筛选-仅检查单个文档-完全在该规则的能力范围内。

再次,诀窍是从大规模规则的角度看待这一点。如果您在一个集合中有数十亿个文档,那么逐个检查每个文档将根本表现不佳,因此该规则将拒绝它。该规则只能真正检查查询过滤器是否匹配规则的特定约束,而不检查每个文档。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Firestore数据库规则在模拟器中有效,但在应用程序中无效

Firestore安全规则在模拟器中有效,但在应用程序中失败

Firebase安全规则在模拟器中有效,但在代码中无效

Firebase 功能在模拟器中有效,但在浏览器中无效

Android Volley请求在模拟器中有效,但在设备中无效

txt文件写入在模拟器中有效,但在实际设备xcode中无效

MFMailComposeViewController navigationBar覆盖在模拟器中有效,但在设备中无效

Firestore规则中的WriteFields仅在模拟器中有效

导航在浏览器中有效,但在Ionic View iPhone应用程序中无效

laravel-permission:assignRole 在 Tinker 中有效,但在应用程序中无效

Python请求在控制台中有效,但在应用程序中无效

SwiftUI 后台模式在模拟器中有效,但在真实设备上无效?

Firebase Cloud 消息在模拟器中有效,但在 IOS 设备上无效

API请求在应用程序中失败,但在浏览器中有效

SQL 语句在 PGAdmin 中有效,但在转换为 Arel 后在应用程序中无效

重写规则在测试器中有效,但在.htaccess中无效

应用程序登录在 chrome 中有效,但在设备上无效

应用程序在开发中有效,但在部署到heroku时无效

RabbitMQ CreateConneciton问题-在一个应用程序中有效,但在另一个应用程序中无效

Unicode(希伯来语)键入:在某些应用程序中有效,但在其他应用程序中无效

Genymotion模拟器对运行android应用程序有效吗?

Firebase安全性“读取”规则仅在模拟器中有效

通知在模拟器上有效,但在实际设备上无效

ftp连接在模拟器上有效,但在实际设备上无效

从 Angular 应用程序调用 OKTA url 给出 404,但在浏览器中有效

“监听器”上的事件未在asp.net中触发,但在控制台应用程序C#中有效

Rails with Devise:用户详细信息未在测试中更新(但在应用程序中有效)

为什么该程序在Python 2.7.6中有效,但在Python 3中无效?

为什么 initContainer `istio-init` 中的 iptables 规则设置在应用程序容器中有效?