Правила базы данных Firebase Realtime - Использование переменной в качестве ключа в паре ключ-значение данных при записи - PullRequest
0 голосов
/ 05 февраля 2020

Это грубый пример того, как выглядит моя база данных.

"userA": {
    "uf": {
        "userB": "0"
    }
},
"users": {
    "userA": "0",
    "userB": "0",
    "userC": "0"
}

И это грубый пример правила, которое я пытаюсь написать.

//USER ID
"$uid": {

  //USER FRIENDS
  "uf": {

    //FRIEND USER ID
    "$fuid": {

      ".write": "$uid === auth.uid &&
      root.child('users').hasChild($fuid)",
    }
  },
},

И это это то, что я пытаюсь заставить работать в симуляторе

//Location /userA/uf/

//Data { "userC": "0" }

Кажется, что правило безопасности всегда будет запрещать запись, когда «ключ» для пары «ключ-значение» является моей переменной, этот случай "$ fuid". Симулятор вернет сообщения «Имитированный набор запрещен» и «Запрет на запись», но не предоставит мне никаких дополнительных подробностей. Я мог бы обойти это, написав следующее:

//Simulation Method set

//Location /userA/uf/userC/

//Data { "0": "0" }

Но похоже, что он записывает ненужные данные в мою базу данных. Какова лучшая практика здесь? Спасибо.

1 Ответ

1 голос
/ 05 февраля 2020

Ваши правила дают доступ к {uid}/uf/{fuid}, но вы пытаетесь написать на {uid}/uf.

То, что {"0": "0"} действительно не нужно, вы можете просто написать "0".

Если вы хотите написать несколько друзей одновременно, вы можете выполнить многолучевое обновление или изменить свои правила, чтобы разрешить запись непосредственно на {uid}/uf и ".validate" детей.

Сторона примечание: если ваши пользователи могут быть удалены, если у пользователя A есть пользователь B в качестве друга, а пользователь B удален, ваши правила не позволят пользователю A удалить пользователя B из списка друзей. Вы должны позаботиться об этом, изменив правила, разрешив удаление несуществующих друзей, или установив onDelete() запускаемую облачную функцию , которая будет выполнять очистку.

...