Есть ли в Firebase Cloud Firestore способ проверить, находится ли путь в массиве <Reference>документа? - PullRequest
0 голосов
/ 05 января 2019

Я пытаюсь добавить правила безопасности в новый проект 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 в моей фактической базе данных, поэтому при входе в систему под именем userId пользователя я мог бы ожидать, что пользователь сможет прочитать документ userId1 и friendId2. пользователи.

У меня проблема в том, что isFriendOf возвращает false. Я пробовал несколько вариантов упаковки данных сравнения в вызове get и передачи других значений, таких как id и data, из возвращаемого ресурса.

Я также пытался обернуть вызов getUserPath в isFriendOf в get и затем использовать свойство __name__ документа в качестве значения для сравнения. Там тоже не повезло.

Любая помощь будет принята с благодарностью.

Редактировать: включая скриншот фактических документов для уточнения.

Снимок экрана с документами Firebase

Редактировать 2: Я сделал чистый проект Firebase с информацией только на этих новых скриншотах. Я включаю снимки экрана со страницей аутентификации Firebase, обе записи пользователей в базе данных, а также сбой симулятора, запущенного одним пользователем, пытающимся получить документ другого пользователя.

Конфигурация аутентификации

user1

user2

Имитация запроса

...