Настройка правил базы данных Firebase Realtime с маркером общего доступа - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть база данных реального времени Firebase, в которой есть 2 коллекции («списки пожеланий» и «пожелания»).Пользователь подключится к нему через приложение или веб-страницу и войдет в систему с помощью Firebase Auth.

Я хотел бы, чтобы пользователи могли делиться своими списками желаний с друзьями, семьей или, может быть, в Твиттере по такой ссылке, какhttp://example.com/wishlist/{wishlist id}/{token id}, но у меня возникают некоторые проблемы с настройкой правил базы данных в реальном времени для безопасного выполнения этого.

Структура базы данных:

{
    "wishlists": {
        "-LMxhMeCLW6uRx8HDI7y" : {  // wishlist id
            "description" : "Testing wishlist",
            "key" : "-LMxhMeCLW6uRx8HDI7y",
            "key_token" : "-LMxhMeCLW6uRx8HDI7y_W0y08HyTAt",
            "title" : "Wishlist token test",
            "token" : "W0y08HyTAt",
            "uid" : "ed5WEbs9OoYv3YqDPZrpp4orBTf2"
        }
    },
    "wishes": {
        "-LMxhMeCLW6uRx8HDI7y" : {  // wishlist id
            "-LN1imfV8hHmuUU8o520" : {  // wish id
                "image" : "",
                "link" : "http://example.com",
                "price" : "200 USD",
                "text" : "Wish description",
                "title" : "Wish title"
            }
        }
    }
}

База данныхна данный момент правила:

{
    "rules": {
        "wishlists": {
            ".read": "auth.uid !== null &&
                         (
                            (query.orderByChild == 'key_token' && query.equalTo == data.child('key_token').val()) ||
                            (query.orderByChild == 'uid' && query.equalTo == auth.uid)
                         )",

            "$wishlist_id": {
                ".write": "auth.uid !== null &&
                              (
                                  data.child('uid').val() == auth.uid ||
                                  (!data.exists() && newData.child('uid').val() == auth.uid)
                               )"
             },

             ".indexOn": ["uid", "key_token"]
        },

        "wishes": {
            "$wishlist_id": {
                ".read": "auth.uid !== null &&
                             (
                                 !root.child('wishlists').child($wishlist_id).exists() ||
                                 root.child('wishlists').child($wishlist_id).child('uid').val() == auth.uid ||
                                 root.child('wishlists').child($wishlist_id).child('key_token').val() == query.equalTo
                             )",
                ".write": "auth.uid !== null &&
                          root.child('wishlists').child($wishlist_id).child('uid').val() == auth.uid"
            }
        }
    }
}

Я получаю список желаний в приложении Ionic 3 через AngularFire2 v5 со следующим кодом:

return this.db.list<Wishlist>('wishlists',
    ref => ref
        .orderByChild('key_token')
        .equalTo(`${wishlistKey}_${authToken}`)
);

В вышеизложенном моя главная проблемаНа мой взгляд, это правило чтения списка желаний со следующим: query.equalTo == data.child('key_token').val(), поскольку data.child('key_token') не существует, потому что «данные» будут коллекцией списков желаний с фактическими списками желаний в качестве дочерних.Как мне получить правильный список желаний и соответственно проверить поле token или key_token?

Я также думал о получении списка желаний с помощью return this.db.object<Wishlist>(), но я не могу понять, как получить правильный список желаний, только если указан токен, поскольку нет доступных функций запроса, таких как equalTo для object()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...