firebase - 依赖文档引用的Firestore访问规则

标签 firebase google-cloud-firestore firebase-security

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

例如,如果存在一个带有docRef属性的文档,该文档是一个Firestore DocumentReference:

const retrievedDoc = await getFirestoreDocument();
console.log(retrievedDoc.docRef.id); // "jRmSeMYDMKiOPGsmkdaZ"

我正在尝试在Firestore规则中完成同样的事情。有一个名为isOwnercustom function。它在文档路径上使用Firestore规则 get 调用,然后尝试访问docRef.id,就像上面的JavaScript客户端一样。
get(/databases/$(database)/documents/path/to/$(id)).data.docRef.id

将文档ID的值与当前用户的ID进行比较。但是,当我使用模拟器并以实际代码对其进行测试时,它会失败。我觉得这应该可行,但事实并非如此。

起作用的是直接将id值而不是DocumentReference存储并使用为字符串(例如get(/path/id).docId)。

是否可以在Firestore规则中访问DocumentReference的id值? 我在做错什么吗?

我想避免在描述in this SO answer的规则内执行第二个文档get。这是该规则的每个触发器的第二个“读取”。而且我认为文档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中存在问题。

    关于firebase - 依赖文档引用的Firestore访问规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52747797/

    相关文章:

    node.js - Firebase 云函数错误 : connect ECONNREFUSED

    firebase - 验证 newData 是否为具有 firebase 数据库规则的数组

    ios - Admob 在 ios 上崩溃

    php - 适用于 PHP 的 Firebase Admin SDK 是隐藏 Firebase 凭据的有效方法吗?

    node.js - 使用云功能的 Firebase 分析日志事件

    android - Android Studio:用于将数据上传到Firebase的辅助类

    firebase - Firestore 文档最大写入速率说明

    android - 如何在Flutter中打印列表后防止自动向下滚动

    android - 如何只允许 Firebase 中的 auth 用户进行读写访问?

    javascript - 尽管更改了数据库规则,但将文件上传到 Firebase 存储仍会返回 403 错误