Javascript Firestore安全错误:缺少更新方法或更新方法不充分
根据下面的规则,我将得到一个缺少或权限不足的错误,但仅适用于更新。我可以创建新文档,但任何更新写入都被拒绝。我错过了什么Javascript Firestore安全错误:缺少更新方法或更新方法不充分,javascript,google-cloud-firestore,Javascript,Google Cloud Firestore,根据下面的规则,我将得到一个缺少或权限不足的错误,但仅适用于更新。我可以创建新文档,但任何更新写入都被拒绝。我错过了什么 match /msgs/{msgs} { allow create: if request.resource.data.keys().hasAll(["name", "msg", "status", "time"]) && request.resource.data.size() == 4 &&
match /msgs/{msgs} {
allow create: if request.resource.data.keys().hasAll(["name", "msg", "status", "time"]) &&
request.resource.data.size() == 4 &&
request.resource.data.name is string &&
request.resource.data.msg is string &&
request.resource.data.status is string &&
request.resource.data.status == "new" || "viewed" &&
request.resource.data.time is timestamp;
allow update: if request.resource.data.size() == 1 &&
request.resource.data.keys().hasAll(["status"]) &&
request.resource.data.status is string &&
request.resource.data.status == "new" || "viewed";
}
我的更新代码非常简单:
docRef.update({
status: "viewed"
})
我认为这里的问题是,在
update
上,大小不是“正在更新的字段数”,而是“更新应用于请求之后,但提交更新之前的对象大小”。这意味着,request.resource.data
除了被写入的内容之外,还被现有的字段/值“水合”。然后检查以确保只有一个字段在更改
这意味着您的规则可能如下所示:
allow update: if request.resource.data.size() == resource.data.size() &&
request.resource.data.name == resource.data.name &&
request.resource.data.msg == resource.data.msg &&
request.resource.data.time == resource.data.time &&
request.resource.data.status == "new" || "viewed";
从Firebase支持团队收到解决方案。事实证明,您需要使每个.data.key值声明独立且不同。因此,实现这一规则的正确方法是:
request.resource.data.status == "new" || "viewed";
是这样的:
request.resource.data.status == "new" || request.resource.data.status == "viewed";
谢谢大家的帮助。
request.resource.data.size()
确实让它听起来像是我发送的负载大小,而不是Firebase发送的负载大小。不过还是要谢谢你!有没有办法减少重复性?创建两个数据的映射,删除状态
字段并进行比较?同意,我们正在努力更好地记录这一点(或者重新考虑如何显示更新的大小)。至于后者,不幸的是目前并不容易。