Правила базы данных Firebase Неожиданное поведение - PullRequest
0 голосов
/ 27 мая 2018

Я следую документации по настройке правил.Это простое приложение чата, и я хочу получать только последние сообщения (т.е. сообщения, которые были созданы за последние X минут).Я нашел следующий документ и попробовал точно то же самое.

Структура

enter image description here

Правила

{
  "rules": {
    "messages": {
      "$message": {
        ".read": "data.child('timestamp').val() > 1" // try allowing everything
      }
    },
    ".write": true
  }
}

Похоже, что ни одно из сообщений не получено.В качестве обходного пути для этого я делаю это на стороне клиента следующим образом:

messagesRef.orderByChild('timestamp')
  .startAt(Date.now() - 600000)
  .on('child_added', (data) => {
    // do something
  })

Надеюсь, кто-то может помочь мне с правилами!

1 Ответ

0 голосов
/ 27 мая 2018

Документация, к которой вы обращаетесь, защищает узел каждого отдельного сообщения.Так что /messages/-LDR_...ADvS доступен, если он не слишком старый.

Но ваш запрос читает из /messages, где вы никому не дали разрешения.

Это пример одного изНаиболее распространенные ошибки в правилах безопасности Firebase: правила не являются фильтрами.Более подробно об этом я рекомендую проверить, что раздел правила не являются фильтрами в документации Firebase, этот первый вопрос, объясняющий это , или некоторые из многих вопросов, упоминающих "правила не являютсяфильтры с тех пор.

Но в этом году ситуация немного изменилась. Хотя правила безопасности по-прежнему нельзя использовать для фильтрации данных, их можно использовать для проверки запросов. Например, см. этот пример из документация по правилам на основе запросов :

"baskets": {
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket
}

Это позволяет читать /baskets как ваш запрос по owner == uid. Итак, теперь мы даем пользователюдоступ к /baskets, но только если они удовлетворяют условию, указанному в наших правилах безопасности на стороне сервера.

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

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