Firebase数据库规则允许更新但禁止创建

时间:2018-10-24 16:41:43

标签: firebase firebase-realtime-database firebase-security-rules

如何通过“允许更新但不允许添加新记录”来设置数据库规则?

我试图在下面模拟,但是不起作用。

我的数据:

{
  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 :(得分:6)

您可以使用validate来检查数据库中是否已经存在电子邮件,这将仅允许对现有用户进行更新。

"users":{
    "$userId":{
      ".write":"auth!=null",
      ".validate":"newData.child('email').val()===data.child('email').val()"
    }

答案 1 :(得分:1)

Firebase实时数据库模拟器可让您测试[读取,设置,更新]

看起来像在处理Firebase对象。

FIREBASE数据库模型-这是您的

{
  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

创建

// 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()"

删除

//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()"

下一个示例允许[创建,更新] 您可以认为就像“创建||更新||删除”。

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

验证规则也是一个好主意。

验证

...
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