Правило безопасности 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-идентификатор.