Правила базы данных Firebase разрешают обновление, но не позволяют создавать - PullRequest
0 голосов
/ 24 октября 2018

Как установить правила базы данных с помощью «разрешать обновление, но не разрешать добавлять новые записи»?

Я пытался смоделировать ниже, но не работает ..

Мои данные:

{
  users:{
    -randomID001:{
      email:user@email.com,
      status:active
    },
    -randomID002:{
      email:user2@email.com,
      status:inactive
    }
  }
}

Имитация в консоли:

{
  "rules": {
    ".read": "auth != null",
    "users":{
      ".indexOn": "email",
      ".write":"!newData.exists() && data.exists()" 
    }
  }
}

Эта строка кода показывает значение для разрешения записи, если новая запись не существует и существует существующая запись ??

".write":"!newData.exists() && data.exists()" 

Ниже приведены данные испытаний, которые я отправляю:

{
  "randomID001":{"status":"inactive"}
}

Я получил следующую ошибку:

Simulated update denied

Пожалуйста, сообщите.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Firebase Realtime Database Simulator позволяет вам тестировать [READ, SET, UPDATE]

Похоже на работу с объектом Firebase.

FIREBASE DB MODEL - здесь естьyours

{
  users:{
    -randomID001:{
      email:user@email.com,
      status:active
    },
    -randomID002:{
      email:user2@email.com,
      status:inactive
    }
  }
}

Попробуйте с разными местоположениями

/users/randomID001  //  exists in your DB
/users/randomID002  //  exists in your DB
/users/randomID003  //  not exists in your DB

CREATE

// newData(json) exists and no randomID001,002 data => FALSE
// newData(json) exists and no randomID003 data => TRUE
".write": "newData.exists() && !data.exists()" 

ОБНОВЛЕНИЕ

// newData(json) exists and target(randomID001,002) data exists => TRUE
// newData(json) exists and target(randomID003) data exists => FALSE
".write": "newData.exists() && data.exists()"

DELETE

//You are sending only HTTP DELETE SIGNAL, NOT JSON
//Target(randomID001,002) data exists => TRUE
//Target(randomID003) data exists => FALSE
".write":"!newData.exists() && data.exists()"

Следующий пример позволяет [создавать, обновлять] Вы можете думать как «CREATE || UPDATE || DELETE».

{
  "rules": { 
    "users": {
      "$uid":{
        ".write": "(newData.exists() && !data.exists()) || (newData.exists() && data.exists())"
      }
    }
  }
}

Также рекомендуется проверять правило проверки.

VALIDATION

...
items: {
    "$itemId": {
      ".validate": "newData.hasChildren(['name', 'message', 'timestamp'])",
      "name": {
        ".validate": "newData.val().length > 0 && newData.val().length < 20"
      },
      "message": {
        ".validate": "newData.isString() && newData.val().length > 0 && newData.val().length < 50"
      },
      "timestamp": {
        ".validate": "newData.isNumber() && newData.val() == now"
      }
}
...

Для обслуживания вашего кода, FirebaseБолт это хороший выбор.https://github.com/firebase/bolt/blob/master/docs/language.md

0 голосов
/ 27 октября 2018

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

"users":{
    "$userId":{
      ".write":"auth!=null",
      ".validate":"newData.child('email').val()===data.child('email').val()"
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...