Firebase规则 - 仅在某些字段上允许.update()

时间:2017-05-09 18:24:10

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

说我有这样的用户集合:

users{
    userId1234 : {
        name: "Joe",
        interests: "Programming",
        score: 1337
    }
}

是否可以编写允许

的规则
let user = {name:"Joey",interests:"Code"};
db.ref("users/").child("userId1234").update(user);

但不允许:

let user = {name:"Joey",interests:"Code",score:9000};
db.ref("users/").child("userId1234").update(user);

基本上,我想保护某个字段不被写入(在本例中得分)。我知道我可以选择将该字段移到另一个集合中,但如果可能的话,我更愿意这样做。

以下是我迄今为止尝试过的方法:

"users":{
        ".write":"auth!=null",
        "$userId":{
          "score":{".write":false},
          "$otherFields":{".write":"auth != null"}
        }
}

^这会阻止写入/ users / userId / score,但它不会使用包含score属性的对象阻止/ users / userId。

"users":{
        ".write":"false",
        "$userId":{
          "score":{".write":false},
          "$otherFields":{".write":"auth != null"}
        }
}         

^这允许我正确地写入字段,但完全阻止.update()。

谢谢! -Joe

1 个答案:

答案 0 :(得分:1)

我的解决方案

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

“。validate”:“!newData.hasChildren(['score'])”不起作用,因为“newData”实际上是更新数据的未来合并结果,而不是发布的原始数据,如果你已经有一个分数,它会失败。