База данных Firebase Realtime предотвращает удаление - в зависимости от условия - PullRequest
0 голосов
/ 01 октября 2019

Я бы хотел предотвратить удаление данных в базе данных Firebase Realtime в зависимости от условия. Пользователь, который не является автором, должен иметь возможность обновлять «заметку», но не удалять ее.

У меня есть коллекция «заметок» в моей базе данных, для которой задан следующий набор правил.

"notes": {
  ".read": "
    auth.uid !== null //&&
  ",
  "$note_id": {
    ".write": "
      //New data
      !data.exists() && auth.uid !== null ||
      //Existing data
      data.child('access').child('author').val() === auth.uid ||
      data.child('access/members').child(auth.uid).exists()          
    ",
    "data": { .. },
    "access": {
      "author" : { .. },
      "members" : { .. }
    }
  }
}

Как я могу разрешить только «автору» удалять «заметку»?

Я пытался использовать облачные функции Google для Firebase, но у меня есть только доступ к событию .onDelete (), которое запускается после удаление уже выполнено. Могу ли я использовать .onWrite () для этой цели - и если да, то как? Я уже реализовал прослушиватели для .onCreate () .onUpdate () и .onDelete () для узла / notes в базе данных.

С уважением, Кермит

Ответы [ 2 ]

1 голос
/ 01 октября 2019

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

Если правил безопасности недостаточно для управления доступом так, как вы хотите, рассмотрите возможность маршрутизации запроса через облачную функцию HTTP-типа, которая проверяет разрешения, затемвыполняет удаление или отклоняет запрос.

0 голосов
/ 01 октября 2019

Я предполагаю, что некоторые правила Firebase вдоль строк

".write" : "
  //Create
  !data.exists() && auth.uid !== null
  //Update
  ||(data.exists() && newData.exists() && data.child('access').child('author').val() === auth.uid || data.child('access/members').child(auth.uid).exists())
  //Delete
  ||(data.exists() && !newData.exists() && data.child('access').child('author').val() === auth.uid)
"

предотвратят удаление, если пользователь не является автором?

...