Firebase实时数据库规则可防止节点删除

时间:2020-04-03 15:50:23

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

我的用户数据库如下:

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,但禁止删除users表或任何用户节点。

我尝试过的事情:

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

如果我向/users/453453452.json发送DELETE请求,我仍然可以删除任何节点。

请问能给我一些帮助吗?

编辑: 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})
});

我可以轻松地使用POSTMAN向myAPI + "/" + userID + ".json"发送DELETE请求以删除所选记录,这是我试图避免的,甚至可以向/users发送空数组来擦除整个数据库。

1 个答案:

答案 0 :(得分:0)

我无法重现问题here。我使用的完整代码是:

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(“值”侦听器中的初始值)

“添加了子-M44hzNISkQNvycyH63B,试图通过POST删除...”

[对象对象] { 错误:“权限被拒绝” }

[object Object] {(on(“ value”侦听器中的下一个值) -M44hzNISkQNvycyH63B:1586012616166 }