Получение данных на основе правила в Firebase - PullRequest
0 голосов
/ 01 сентября 2018

Я пытаюсь получить данные из базы данных в реальном времени в Firebase на основе зарегистрированного пользователя.

Мои узлы в Firebase выглядят так: https://prnt.sc/kpdoq9 и мои правила настроены так:

{
  "rules": {
    "userhours": {
      "$uid": {
        ".read": "auth != null && auth.uid == $uid",
        ".write": "auth != null && auth.uid == $uid"
      }   
    }
  }
}

Когда я пытаюсь получить данные с помощью моего метода:

  loadUserHours() {
      firebase
        .database()
        .ref("userhours")
        .once("value")
        .then((data) => {
            const obj = data.val();
            console.log(obj)
            })
        },

Я получаю Error: permission_denied at /userhours

Я думаю, что это связано с правилами

".read": "auth != null && auth.uid == $uid",
".write": "auth != null && auth.uid == $uid"

Поскольку "главный внутренний узел" - это не фактический uid (зарегистрированный идентификатор пользователя), а случайный ключ, сгенерированный Firebase? Как должна выглядеть моя структура?

Я предполагаю, что правило ищет uid в пути userhours/{uidhere}/.., когда узел firebase настроен как userhours/{randomKeyGeneratedByFirebase}/..

1 Ответ

0 голосов
/ 01 сентября 2018

Правила безопасности базы данных Firebase не фильтруют данные для вас. Вместо этого он только проверяет, разрешен ли слушателю доступ к данным, когда вы его прикрепляете.

Когда пользователь присоединяет слушателя к /userhours, сервер базы данных Firebase проверяет, есть ли у него разрешение на чтение для этого узла. Поскольку вы предоставляете разрешение на чтение только на /userhours/$uid, никто не имеет разрешения на чтение на /userhours, и чтение отклонено.

Вместо этого вы захотите подключить слушателя к /userhours/$uid. Итак:

firebase
  .database()
  .ref("userhours")
  .child(firebase.auth().currentUser.uid)
  .once("value")
  .then((data) => {
      const obj = data.val();
      console.log(obj)
  })
...