Firebase实时数据库规则-写入时

时间:2020-02-05 11:24:02

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

这是我数据库的大致示例。

"userA": {
    "uf": {
        "userB": "0"
    }
},
"users": {
    "userA": "0",
    "userB": "0",
    "userC": "0"
}

这是我要编写的规则的粗略示例。

//USER ID
"$uid": {

  //USER FRIENDS
  "uf": {

    //FRIEND USER ID
    "$fuid": {

      ".write": "$uid === auth.uid &&
      root.child('users').hasChild($fuid)",
    }
  },
},

这就是我要在模拟器中进行的工作

//Location /userA/uf/

//Data { "userC": "0" }

当数据键值对的“键”是我的规则中的变量(在本例中为“ $ fuid”)时,安全规则似乎总是拒绝写入。模拟器将返回消息“拒绝模拟集”和“拒绝写入”,但不会提供任何其他详细信息。我可以通过编写以下内容解决此问题。

//Simulation Method set

//Location /userA/uf/userC/

//Data { "0": "0" }

但这感觉就像是在向数据库中写入不必要的数据一样。这里的最佳做法是什么?谢谢。

1 个答案:

答案 0 :(得分:1)

您的规则可以访问{uid}/uf/{fuid},但是您尝试在{uid}/uf上书写。

{"0": "0"}确实是不必要的,您只需写"0"

如果您想一次写多个朋友,则可以执行multipath update,或修改规则以直接在{uid}/uf".validate"个孩子处写作。

侧面说明:如果可以删除用户,如果用户A将用户B作为朋友,而用户B也被删除,则您的规则将不允许用户A从朋友列表中删除用户B。您应该通过更改规则以允许删除不存在的朋友,或设置onDelete() triggered cloud function进行清理来解决此问题。