Firebase验证动态子键

时间:2017-12-23 20:41:10

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

假设我有以下数据结构:

users {
    "GSlxbK0iBYC30d1LDnIaMmERFa6" {
        "friends": {
            "H2JBkBgiGx1QCn2D4Ku6ZEKpuYu": true,
            "45iOj1Ak4Y7PmxHqcnR2I4DfMBS": true,
            "KFhzQdJZOPn9g3vAJLUo4MSTkBa": true
        }
    }
}

'用户'钥匙和朋友'密钥是auth.uid GUID。我想在“朋友”下验证孩子的价值仅为布尔值。

我尝试了以下内容:

{
    "rules": {
        "$user_id": {
            ".read": "newData.child($user_id).val() == auth.uid",
            ".write": "newData.child($user_id).val() == auth.uid",

            "friends": {
                ".validate": "newData.child($friend_id).isBoolean()"
            }
        }
    }
}

但是,我在尝试发布时返回以下错误:

Error saving rules – Line 8: Unknown variable '$friend_id'.

有没有办法将叶键称为变量?

我更新了规则如下,试图解决这个问题,成功发布了这个:

{
    "rules": {
        "$user_id": {
            ".read": "newData.child($user_id).val() == auth.uid",
            ".write": "newData.child($user_id).val() == auth.uid",

            "friends": {
                ".validate": "newData.isBoolean()"
            }
        }
    }
}

但是,在运行模拟器时,它在验证行上失败并显示以下错误:

Line 8 (/users/GSlxbK0iBYC30d1LDnIaMmERFa6/friends)
validate: "newData.isBoolean()"

即使在阅读文档之后,我对此验证规则正在评估的内容以及为什么在我的数据集包含布尔叶值时失败的原因感到困惑。

协助表示赞赏。

1 个答案:

答案 0 :(得分:2)

你几乎就在那里,但是你确认一个级别太高了。由于您要验证朋友ID本身,您需要在其$friendid节点中定义验证:

{
    "rules": {
        "$user_id": {
            ".read": "newData.child($user_id).val() == auth.uid",
            ".write": "newData.child($user_id).val() == auth.uid",

            "friends": {
                "$friendId": {
                    ".validate": "newData.isBoolean()"
                }
            }
        }
    }
}