gpt4 book ai didi

javascript - Firestore 安全规则 - 相同的规则适用于写入但不适用于读取

转载 作者:行者123 更新时间:2023-12-04 08:23:43 25 4
gpt4 key购买 nike

我正在开发一个使用 Firestore 的 Firebase 项目。
我正在查询 Firestore 以从消息集合中获取聊天消息。我只想要属于某个对话的消息:

const messages = await db
.collection('messages')
.where('room', '==', room)
.onSnapshot(snap => {//stuff})
所以很好。有用。当我设置安全规则时出现问题。
如果我做一些简单的事情,例如:
allow read: if request.auth != null;
一切安好。但是,如果我只想允许访问 uid 包含在 'partyIDs' 消息对象属性中的用户,则会出现问题:
allow read: if
request.auth.uid == resource.data.pertiesIDs[0] ||
request.auth.uid == resource.data.parties[1];
最奇怪的是,我有一个非常相似的更新规则,它按预期工作:
allow update: if
(request.resource.data.diff(resource.data).affectedKeys()
.hasOnly(['read', 'notified'])) &&
(request.auth.token.name == resource.data.parties[0] ||
request.auth.token.name == resource.data.parties[1]);
第二条规则(有效)的查询如下所示:
const update = await db
.collection('messages')
.doc(docid)
.update({read: true, notified: true})
我卡住了!有人能解释一下这个谜团吗?

最佳答案

问题是Firestore security rules are not filters .我强烈建议阅读该文档。
当您编写规则来为集合中的文档读取设置条件时,客户端必须进行与规则条件完全匹配的查询。当您要求某些数据必须存在于某个字段中时,您的查询必须通过仅过滤满足规则要求的字段内容的文档来匹配该要求。 规则不会只提取匹配的文档来返回它们。 您可以将客户端查询视为要求与给定过滤器匹配的完整文档集,而规则则是因为条件不满足而拒绝该需求。
但是,这里有一些问题,因为查询没有指定数组索引的方法。无法进行要求数组字段的索引 0 必须包含特定值的查询。
我建议重新考虑您的文档数据和规则,并以客户端应用程序可以完全符合他们的要求的方式构建它们。

关于javascript - Firestore 安全规则 - 相同的规则适用于写入但不适用于读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65376179/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com