Firestore规则不适用于收集

乔纳斯:

我有一个Routines集合,其中包含字段的文档programId不应被阅读。

我有以下的存储规则:

match /Routines/{routineId=**} {
    allow write: if false;
    allow read: if !('programId' in resource.data);
}

当我从该集合中获取文档时,规则将按预期的方式运行,但是当我获取整个集合时,我将获取所有文档,甚至是具有programId集合的文档因此,似乎该规则不适用于集合。

我得到这样的集合:

const res = await firebase.firestore().collection("Routines").get();
道格·史蒂文森(Doug Stevenson):

问题是Firestore安全规则不是过滤器请务必阅读并理解该文档以及这篇文章您的查询正在询问Routines集合中的所有文档。安全规则将允许该请求提供所有文档,或者完全拒绝。他们不会提供与某些条件匹配的那些文档的子集。如果安全规则无法扫描所有文档的内容以检查其值-不能像Firestore那样大规模扩展。

不幸的是,这里还有第二个问题,因为实际上没有办法使您的查询与您的规则相匹配。Firestore没有提供过滤文档中字段存在的方法。您只能过滤实际存在的已知字段值。这意味着您应该考虑替代数据建模。也许您想添加一个名为“ hasProgramId”的布尔字段,并确保该字段始终为true或false,以便可以在规则和查询过滤器中使用它。

所以您的查询可能是这样的:

const res = await firebase.firestore()
    .collection("Routines")
    .where("hasProgramId", "==", true)
    .get();

您的规则可以检查以确保客户端请求有效,如下所示:

match /Routines/{routineId=**} {
    allow write: if false;
    allow read: if resource.data.hasProgramId;
}

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

.htaccess文件中的重写规则不适用于子域到主域

Yii2:复选框规则不适用于注册条款和条件

Laravel验证器哑剧规则不适用于文档

Nginx:重写规则不适用于图像

网格区域CSS规则不适用于Chrome

无未使用变量的TSLint规则不适用于私有@HostBinding

为什么Firebase数据库安全规则不适用于Authenticated REST API?

VeeValidate,已确认的规则不适用于ValidationProvider

.htaccess重写规则不适用于index.php?path

RewriteRules和ErrorDocument规则不适用于SSL虚拟主机

Traefik 2.0-路径路由器规则不适用于docker标签

CSS规则不适用于jquery附加的元素

用于检查用户是否在频道中的Firebase规则不适用于.exists或.val

为什么排序规则不适用于子查询中的xml路径?

.htaccess规则不适用于奇怪的字符

某些CSS规则不适用于外部链接

Firebase实时数据库规则不适用于新用户

Firebase安全规则不适用于CollectionGroup

UFW规则不适用于Docker

重定向规则不适用于htaccess中的index.php

iptables规则不适用于端口80

JSF导航规则不适用于表单提交

适用于Android的udev规则不适用于go-mtpfs

为什么访问规则不适用于非根用户组?

iptables时间规则不适用于反向时间

重写规则不适用于分页

IIS url 重写规则不适用于 MVC 控制器操作

Firestore 规则适用于模拟器但不适用于网站

为什么 CSS 规则不适用于真正的 HTML 页面,但适用于 JSFiddle?