首页 > 解决方案 > 依赖于文档参考的 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).docIdDocumentReference。

我应该能够id在 firestore 规则中访问 DocumentReference 的值吗?难道我做错了什么?

我想避免在此 SO answerget中描述的规则中创建第二个文档。这是该规则的每个触发器的第二次“读取”。而且我认为无论如何在通话中都不会提供文档ID(这是我需要的) 。get

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


根据文档:

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 中存在问题。


推荐阅读