Правило безопасности Firebase для массива сообщений

Я пытаюсь отобразить список сообщений, основанных на получателе, но сейчас давайте сделаем это просто. Я просто пытаюсь отобразить список сообщений.

Мое правило выглядит так

{
"rules": {
  "communications" : {
    "$communication":{
      ".read" : true,
      ".write": true
    }
  }
}

По какой-то причине мое приложение не хочет читать его

fireRef = new Firebase(url);
fireRef.auth(MY_TOKEN);
commsRef = fireRef.child('communications')
$scope.communications = $firebase(commsRef)

Это работает, только если у меня есть правило, похожее на

{
"rules": {
  "communications" : {
    ".read" : true,
    ".write": true
  }
}

Но это вызовет проблемы, так как я хотел бы добавить условие на дочерний узел моего общения. Что-то вроде:

{
"rules": {
  "communications" : {
    ".read" : true, ### I would like to get rid of this line as well and have the child handling it
    ".write": true,

    "$communication":{
      ".read" : "data.child('to').val() == auth.uid"
    }
  }
}

Я предполагаю, что это потому, что у меня есть $firebase для связи, и ему нужны некоторые правила чтения или записи, но как я могу получить событие, когда новое сообщение добавляется иначе

Спасибо

1 ответ

Решение

Что касается правил безопасности, операции Firebase выполняются по принципу "все или ничего".

Это означает, что списки данных, отправляемых клиенту, никогда не будут неполными, или отфильтрованные представления полных данных сервера. В результате при попытке загрузить все данные в /communications произойдет сбой при использовании вашего первого набора правил безопасности, даже если у вас есть разрешение на чтение некоторых данных в соответствии с дочерним правилом в /communications/$communication,

Для обработки этого варианта использования рассмотрите возможность реструктуризации ваших данных таким образом, чтобы каждое сообщение индексировалось получателем, т.е. /communications/$recipient/$communication, что упростит ваши правила безопасности.

Кроме того, вы можете даже сделать этот контейнер доступным только для чтения получателем (т.е. .read: auth.id == $recipient) позволяя кому-либо отправить сообщение этому пользователю (т.е. .write: auth != null && !data.exists()). Это последнее правило гарантирует, что отправляющий клиент проходит проверку подлинности и записывает данные в местоположение, которое еще не существует, например, новый push-идентификатор.

Другие вопросы по тегам