允许推送到用户在Firebase中没有权限的对象的子列表

时间:2014-06-10 13:52:56

标签: firebase firebase-security

我正在尝试创建以下结构:

[
    {
        name: 'tester',
        comment: 'first comment',
        comments: [
            {
                name: 'tester2',
                comment: 'reply'
            }
        ]
    }
]

我已设置以下安全规则:

{
    "rules": {
        ".read": true,
        "comments": {
            "$recording": {
                "$comment": {
                    ".write": "!data.exists() && auth != null",
                    ".validate": "auth.name == newData.child('name').val() && newData.hasChildren(['name', 'comment']) && newData.child('comment').isString()",
                    "comments": {
                        "$reply": {
                            ".write": "!data.exists() && auth != null",
                            ".validate": "auth.name == newData.child('name').val() && newData.hasChildren(['name', 'comment']) && newData.child('comment').isString()"
                        }
                    }
                }
            }
        }
    }
}

但是当我尝试push()到现有评论的comments属性时,第一个!data.exists()中的.write会失败。即使不这样做,第一个auth.name == newData.child('name').val()中的.validate也会失败。

所以我的问题是:如何在防止更改其他属性的同时有选择地允许推送属性?换句话说,我是否可以注意到我是在尝试写入.write.validate / comments / 1/2中的/ comments / 1/2/3?

1 个答案:

答案 0 :(得分:1)

写规则有" OR"关系。您只需要一个成功允许写入。验证规则有一个" AND"关系 - 他们都需要成功地允许写作。

我不确定为什么上面的例子不起作用。你应该可以推送到/ comments / $ recording / $ comment / comments /

我建议您通过Firebase控制台中的规则模拟器运行此操作,以了解您的写入失败的原因。