Правила базы данных Firebase в реальном времени предотвращают удаление узлов - PullRequest
0 голосов
/ 03 апреля 2020

Моя база данных пользователей выглядит следующим образом:

root
  users
   453453452
       name: user1
       email: email@example.com
       permissions: [1,2,3]
   457575684
       name: user2
       email: email2@example.com
       permissions: [1,2,3]
   234235346
   123245346
   436286785
   474574725

Я пытаюсь разрешить запись в /users и в пользовательский узел /users/453453452, но предотвратить удаление таблицы пользователей или любых других. пользовательский узел.

Что я пробовал:

{
    "rules": {
        "users": {
            ".read": false,
            ".write": "newData.exists() && newData.val() != null",
            "$user": {
                ".read": true,
                ".write": "newData.exists() && newData.val() != null",
            }
        }
    }
}

Я все еще могу удалить любой узел, если отправлю запрос DELETE на /users/453453452.json.

Могу ли я получить Вам нужна помощь?

Редактировать: 1- Добавление пользователя в базу данных после успешной покупки, где userID - это хешированный уникальный идентификатор пользователя по его адресу электронной почты.

fetch(myAPI + "/" + userID + ".json", {
    method: 'PUT',
    headers: {'Accept': 'application/json, application/xml, text/plain, text/html, *.*',
        'Content-Type': 'application/json; charset=utf-8'},
    body: JSON.stringify({"name": userName,"email": userEmail, "order_id": orderID})
});

Я могу легко отправить запрос DELETE с помощью POSTMAN на myAPI + "/" + userID + ".json", чтобы удалить выбранную запись, которую я пытаюсь избежать, или даже отправить пустой массив на /users, который уничтожит всю базу данных.

1 Ответ

0 голосов
/ 04 апреля 2020

Я не могу воспроизвести проблему здесь . Полный код, который я использую:

var url = "https://stackoverflow.firebaseio.com/61015647";

fetch(url+".json", {
  method: 'POST', // *GET, POST, PUT, DELETE, etc.
  headers: {
    //'Content-Type': 'application/json'
    'Content-Type': 'application/x-www-form-urlencoded',
  },
  body: JSON.stringify(Date.now())
}).then(function(response) {
  return response.json()
}).then(function(json) { 
  console.log("Child "+json.name+" added, trying to delete with POST...");
  return fetch(url+"/"+json.name+".json", {
    method: "DELETE"
  })
}).then(function(response) {
  return response.json()
}).then(function(json) { 
  console.log(json);
}).catch(function(error) {
  console.error(error);
});

и соответствующие правила:

{
  "rules": {
    "61015647": { 
      ".read": true, 
      "$child": { 
        ".write": "newData.exists() && newData.val() != null" 
      } 
    }
  }
}

Когда я запускаю этот код, вывод:

null (начальное значение из on (слушателя "value")

"Дочерний -M44hzNISkQNvycyH63B добавлен, попытка удалить с помощью POST ..."

[object Object] {error: "Разрешение отклонено "}

[object Object] {(следующее значение из on (слушатель" value ") -M44hzNISkQNvycyH63B: 1586012616166}

...