firebase - Firestore 规则:对象上的属性未定义
问题描述
在我使用 firebase 模拟器的本地环境中,我有以下规则会引发FirebaseError: Property managers is undefined on object. for 'list'
:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /businesses/{business} {
allow read: if request.auth != null && request.auth.uid in resource.data.managers;
}
}
}
如果我在规则 Playground 上测试相同的规则,它可以正常工作(Simulated read allowed
)..
为了证明我已经定义了 manager 属性并且可用,如果我将规则更改为if true
,我可以使用以下本地数据在列表中循环:
// code
...
.then((snap) => snap.forEach((doc) => console.log(doc.id, " => ", doc.data())))
// output
VzaU8rX8HOgejk0fyOFK => {..., managers: Array(1)}
我究竟做错了什么?
谢谢 !
更新
这是我希望应用规则的代码:
useEffect(() => {
db.collection("businesses")
.where("slug", "==", params.slug)
.get()
.then((snap) => {
if (!snap.empty) {
// slug is supposed to be unique, so I retrieve the first and only element
const doc = snap.docs[0]
setBusiness({ id: doc.id, data: doc.data() })
setState({ ...state, loading: false, data: true })
} else {
setState({ ...state, loading: false, error: "Business not found" })
}
})
.catch((error) => {
console.log("Error getting document:", error)
setState({ ...state, loading: false, error: "Error getting document" })
})
}, [])
解决方案
您的规则在控制台模拟器中有效,因为它一次只测试单个文档的读取。但是,您的客户端代码正在执行对多个文档的查询,这是不同的。要知道的一件非常重要的事情是安全规则不是过滤器(请务必阅读该内容和此内容)。如果规则拒绝文档,则安全规则不会从结果集中删除文档。相反,查询必须能够获取规则允许的所有文档,否则规则将完全拒绝查询。
查询必须明确具有与规则要求相同的过滤器。 您的规则要求查询仅过滤当前用户在管理器数组字段中的文档。因此,查询必须更像这样:
db.collection("businesses")
.where("slug", "==", params.slug)
.where("managers", "array-contains", uid)
uid
当前用户的uid在哪里。
推荐阅读
- c# - 使用 LINQ 过滤列表的最佳方法是什么?
- advanced-installer - 导入 Visual Studio 项目时无法加载文件或程序集 System.Runtime.CompilerServices.Unsafe,版本 = 4.0.4.0
- c++ - 如何削减平面缓冲区矢量大小?
- angular - 登录角度后如何重定向到主页
- python - 未找到带有参数 '('',)' 的 'update_cart' 的反向操作。尝试了 1 种模式:['cart/(?P
[\\w-]+)/'] - amazon-web-services - AWS EC2 访问本地存储
- python - 基于 BERT 的 NER 模型在反序列化时给出不一致的预测
- android - 即使片段没有使用导航组件出现,也会调用片段中的 onSaveInstanceState()
- python - 在 Python Pandas 中填充缺失的数据并将行转换为列
- regex - 正则表达式格式“YYYY/NNNN”或“YYYY/NNNN/国家代码”