У меня есть база данных реального времени 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()