firebase - 依赖于文档参考的 Firestore 访问规则
问题描述
Firestore 有一个DocumentReference类型,它是指向另一个 firestore 文档的“指针”。使用 firebase JavaScript 客户端,您可以直接在引用上访问属性(例如文档“id”)。
例如,如果有一个文档的docRef
属性是 firestore DocumentReference:
const retrievedDoc = await getFirestoreDocument();
console.log(retrievedDoc.docRef.id); // "jRmSeMYDMKiOPGsmkdaZ"
我试图在 Firestore 规则中完成同样的事情。有一个名为的自定义函数isOwner
。它在文档路径上使用 firestore 规则get
调用,然后尝试访问docRef.id
就像上面的 JavaScript 客户端一样。
get(/databases/$(database)/documents/path/to/$(id)).data.docRef.id
将文档 id 的值与当前用户的值进行比较。但是当我使用模拟器和真实代码测试它时,它失败了。我觉得这应该有效,但事实并非如此。
起作用的是将 id 值直接存储和使用为字符串(例如)而不是get(/path/id).docId
DocumentReference。
我应该能够id
在 firestore 规则中访问 DocumentReference 的值吗?难道我做错了什么?
我想避免在此 SO answerget
中描述的规则中创建第二个文档。这是该规则的每个触发器的第二次“读取”。而且我认为无论如何在通话中都不会提供文档ID(这是我需要的) 。get
解决方案
根据文档:
- https://firebase.google.com/docs/reference/rules/rules.firestore#.get
- https://firebase.google.com/docs/reference/rules/rules.firestore.Resource
get()
方法应该返回一个 Resource 对象,该对象应该包含一个.id
属性(以及.data
)。
例如,要限制write
对作为书籍文档作者的经过身份验证的用户的访问(作者文档使用用户 uid 标识),您可以执行以下操作:
service cloud.firestore {
match /databases/{database}/documents {
match /books/{document=**} {
allow write: if get(resource.data.authorReference).id == request.auth.uid;
}
}
}
然而,我总是property id is undefined on object
在尝试时出错。
.data
是可访问的,所以我认为 api 中存在问题。
推荐阅读
- regex - 正则表达式解决方法在lookbehind内无限重复
- android - 移动设备的pdf转换
- wordpress - 阅读更多按钮 jquery 隐藏仅适用于 wordpress 中 div 的第一个元素
- ubuntu - Ubuntu Server 18.04 KVM 网络问题
- javascript - 让 Javascript(不是 JQuery)向上或向下移动表行(TR),而不仅仅是单元格(TD)
- java - 尝试在 Kafka 中创建分区时出现 NoClassDefFoundError
- jquery-ui - BootStrap DatePicker NoConflict - 未捕获的类型错误
- c++ - 用 C 或 C++ 写入硬件时是否需要使用 volatile?
- javascript - 有没有合适的方法来做到这一点。我怎样才能做到这一点?
- javascript - 阻止某些频道中的消息 discord.js