我遇到了Firebase安全性的痛苦问题。
我希望经过身份验证的用户在子节点下创建子节点但不允许删除任何子节点。
请参阅'used'节点中的评论
以下安全规则:
"users": {
"$userid":{
".read": "$userid === auth.uid",
".write":" $userid === auth.uid && newData.exists()",
//writeable by user
"qrcodevalue":{},
"datesubscribed":{},
//not writeable by user
"confirmed":{".validate":false},
"issubscribed":{".validate":false},
"periodend":{".validate":false},
"stripeid":{".validate":false},
"stripesubscription":{".validate":false},
"subscriptionstatus":{".validate":false},
//user should be able to create children under this node but not delete
"used":{
"$promotionid":{
"dateused":{}
}
},
}
},
非常感谢任何帮助。
答案 0 :(得分:3)
来自Firebase security documentation on new and existing data:
预定义数据变量用于在执行写入操作之前引用数据。相反,newData变量包含写操作成功时将存在的新数据。 newData表示正在写入的新数据和现有数据的合并结果。
为了说明,只要数据在给定路径上不存在,而不是对数据进行更改,请考虑允许我们创建新记录或删除现有记录的规则:
// we can write as long as old data or new data does not exist
// in other words, if this is a delete or a create, but not an update
".write": "!data.exists() || !newData.exists()"
所以对你而言会转化为这样的东西:
//user should be able to create children under this node but not delete
"used":{
"$promotionid":{
"dateused":{
".write": "newData.exists()"
}
}
},
这允许用户将任何数据写入节点,但不能删除它。
如果您希望他们只创建但不更改数据,则会变为:
".write": "!data.exists() && newData.exists()"