依赖于文档参考的Firestore访问规则

wtk*_*wtk 14 firebase firebase-security google-cloud-firestore

Firestore有一个DocumentReference类型,它是另一个firestore文档的"指针".使用firebase JavaScript客户端,您可以直接在引用上访问属性(例如文档"id").

例如,如果有一个文档的docRef属性是firestore DocumentReference:

const retrievedDoc = await getFirestoreDocument();
console.log(retrievedDoc.docRef.id); // "jRmSeMYDMKiOPGsmkdaZ"
Run Code Online (Sandbox Code Playgroud)

我试图在firestore规则中完成同样的事情.有一个名为的自定义函数isOwner.它使用get文档路径上的firestore规则调用,然后尝试访问docRef.id它,就好像它是上面的JavaScript客户端一样.

get(/databases/$(database)/documents/path/to/$(id)).data.docRef.id
Run Code Online (Sandbox Code Playgroud)

将文档id的值与当前用户的值进行比较.但是当我使用模拟器和实际代码测试时,它会失败.我觉得这应该有效,但事实并非如此.

什么的工作是存储和直接使用id的值作为字符串(例如get(/path/id).docId),而不是DocumentReference的.

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

我想避免get在规则中执行第二个文档,如本SO答案所述.对于此规则的每个触发器,这是第二次"读取".而且我认为get无论如何都不会在电话上提供文件ID(这就是我需要的).

Aka*_*bab 5

基于文档:

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;
    }
  }

}
Run Code Online (Sandbox Code Playgroud)

然而,我总是property id is undefined on object在尝试时出错。 .data是可访问的,所以我认为 api 中存在问题。