这是我数据库的大致示例。
"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" }
但这感觉就像是在向数据库中写入不必要的数据一样。这里的最佳做法是什么?谢谢。
答案 0 :(得分:1)
您的规则可以访问{uid}/uf/{fuid}
,但是您尝试在{uid}/uf
上书写。
{"0": "0"}
确实是不必要的,您只需写"0"
。
如果您想一次写多个朋友,则可以执行multipath update,或修改规则以直接在{uid}/uf
和".validate"
个孩子处写作。
侧面说明:如果可以删除用户,如果用户A将用户B作为朋友,而用户B也被删除,则您的规则将不允许用户A从朋友列表中删除用户B。您应该通过更改规则以允许删除不存在的朋友,或设置onDelete()
triggered cloud function进行清理来解决此问题。