首页 > 解决方案 > Firestore 规则访问父文档

问题描述

所以我正在制作一个带有朋友系统的应用程序,并尝试为firebase设置规则来处理用户是否是朋友的读写操作。我非常坚持一个特定的电话,我只是不知道如何拨打电话。我的firestore的结构如下:

用户/userUID/places/documentsofplaces

每个用户文档都有一些常用信息、名称、用户名等字段和一个朋友UID 数组。我设法弄清了第一部分,即用户只能在其 UID 与 documentUID 匹配的情况下读写,并且在好友列表中查看朋友只能读但不能写。下一部分,在places 集合中,只是让我失望,我如何获取父文档并将userUID 与好友列表中的UID 进行比较?这是我到目前为止所拥有的:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {

    match /users/{userId} {
        // Allow write and read if user, and read if friend
      allow write: if isUser(userId);
      allow read: if isUser(userId) || isFriend();

      function isUser(userId) {
        return (request.auth.uid == userId);
        }

      function isFriend() {
            return (request.auth.uid in resource.data.friendsList);
        }

    }
    match /users/{userId}/places/{documents} {
        allow write: if isUser(userId);
        allow read: if isUser(userId) || isFriend(userId);

        function isUser(userId) {
        return (request.auth.uid == userId);
        }

      function isFriend(userId) {
            return (request.auth.uid in get(/databases/$(database)/documents/users/userId.resource.data.friendsList));
        }

    }
  }
}

任何帮助是极大的赞赏!

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


您的文档get()应该看起来更像这样:

get(/databases/$(database)/documents/users/$(userId)).data.friendsList

您必须$(var)在文档路径中使用带有符号的变量。 get()返回一个带有 data 属性的 Resoruce 对象。我建议阅读文档以获取更多详细信息以访问其他文档


推荐阅读