在我正在创建的iOS消息传递应用程序中,消息节点的结构概述如下
"messages": {
"$uid":{
".read": "auth.uid == $uid",
"$messageId":{
// insert .write rule here
"toUid":{
// if its a group message then there would be multiple "$toUid" children
"$toUid":{
},
},
"fromUid":{
"$fromUid":{
}
},
"timeStamp":{
},
"group":{
"isGroupMessage":{
},
"groupId":{
}
}
}
}
},
我想在$ messageId之后添加一个写规则,以确保" $ toUid"或" $ fromUid"等于$ uid。
我有什么想法可以做到这一点?
以下是最好的方法:
".write": "newData.child('toUid').hasChild($uid) || newData.child('fromUid').hasChild($uid)",
**我已经使用了以下解决方案 - 更改结构,但这是我们现在使用的最快/最安全的安全规则。
MVP最初不会有群组消息(可能不相关但逻辑可能不同) - 所以我可以添加一个wildCard子变量" $ friendUid"然后在下面有以下规则。
"$messageId":{
"$friendUid":{
".write": "$uid == auth.uid || $friendUid == auth.uid",
答案 0 :(得分:1)
所以这就是我决定为我的消息节点构建Firebase数据库规则的方法。我添加了一个带有通配符变量" $ friendUid"的额外子节点,以便轻松引用它并锁定我的消息分支。
"messages": {
"$uid":{
".read": "auth.uid == $uid",
"$messageId":{
"$friendUid":{
".write": "$uid == auth.uid || $friendUid == auth.uid",
".validate": "root.child('friends/'+$uid+'/'+$friendUid).exists()",
"toUid":{
"$toUid":{
".validate": "$toUid == $friendUid || $toUid == $uid"
},
},
"fromUid":{
"$fromUid":{
".validate": "$fromUid == $friendUid || $fromUid == $uid"
},
},
"timeStamp":{
".validate":"newData.isNumber()"
},
"$other":{
".validate": false
}
}
}
}
},