Firebase Cloud Firestore中是否有一种方法可以检查路径是否在文档的Array <reference>中?

时间:2019-01-05 19:56:14

标签: firebase google-cloud-firestore firebase-security firebase-security-rules

我正在尝试将安全性规则添加到我正在处理的新Firestore项目中。我有一个名为users的集合,其中所有用户数据都以这种格式存储在Firestore数据库中:

var users = {
    "userId": {
        friend_requests: [],
        friends: [
            /users/friendId1,
            /users/friendId2
        ],
        name: "User One",
        username: "user1"
    },
    "friendId1": {
        friend_requests: [],
        friends: [
            /users/userId
        ],
        name: "User Two",
        username: "user2"
    },
    "friendId2": {
        friend_requests: [],
        friends: [
            /users/userId
        ],
        name: "User Three",
        username: "user3"
    },
    "lonelyUser": {
        friend_requests: [],
        friends: [],
        name: "Lonely User",
        username: "lonely_user"
    }
}

我的Firestore规则是逐字记录的:

service cloud.firestore {
    match /databases/{database}/documents {
        match /{document=**} {
        allow read, write: if false;
        }

        match /users/{userId} {
            allow read: if isOwner(userId) || isFriendOf(userId);
        }
    }

    function isOwner(userId) {
        return userId == currentUser().uid;
    }

    function isFriendOf(userId) {
        return getUserPath(userId) in getUserData().friends;
    }

    function currentUser() {
        return request.auth;
    }

    function getUserData() {
        return get(getUserPath(currentUser().uid)).data;
    }

    function getUserPath(userId) {
        return /databases/$(database)/documents/users/$(userId);
    }
}

我在上面概述的地图中的键是实际数据库中的Firebase用户ID,因此当以用户“ userId”身份登录时,我希望能够读取“ friendId1”和“ friendId2”的用户文档用户。

我遇到的问题是isFriendOf返回的是false。我尝试了几种变体,将比较数据包装在get调用中,并从返回的资源中传入其他值,例如iddata

我还尝试将getUserPath中的isFriendOf调用包装在get中,然后也将文档的__name__属性用作比较值。那里也没有运气。

任何帮助将不胜感激。

编辑:包括用于澄清的实际文档的屏幕截图。

Screenshot of Firebase Documents

编辑2:我制作了一个干净的firebase项目,其中仅包含这些新屏幕截图中的信息。我包括Firebase身份验证页面的屏幕快照,数据库中的两个用户条目以及一个失败的模拟器,一个用户试图获取另一用户的文档而运行。

Authentication Configuration

user1

user2

Simulated Request

0 个答案:

没有答案