如何在Firebase中引用子通配符变量

时间:2017-03-07 11:41:44

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

在我正在创建的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",

1 个答案:

答案 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
                    }
                }
            }
        }
    },