Firebase安全规则检查新数据的值以进行身份​​验证

时间:2016-06-08 04:04:25

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

我开始使用firebase为我的移动应用编写安全规则。我现在有以下安全规则

{
    "rules": {
        ".read": "auth != null",
        ".write": "auth != null || newData.child('appSecret').val() === '123'",
        "queue": {
          "tasks" : {
            ".indexOn": "_state"
          }
        }
    }
}

在写规则中,我正在检查auth数据是否为空,或者正在插入的数据是否包含预先确定的应用程序密钥。规则的第二部分是向firebase-queue添加任务以从服务器获取自定义令牌以验证移动应用用户。我会在为应用添加其他规则后将此规则移至/queue/tasks

我现在无法使用上述规则将任务添加到队列中。我尝试在模拟器中写入,然后得到以下输出。

Attempt to write {"appSecret":"123","task":"GET_AUTH_TOKEN"} to /queue/tasks/23232 with auth=null
    /:.write: "auth != null || newData.child('appSecret').val() === '123'"
        => false
    /queue
    /queue/tasks
    /queue/tasks/23232:<no rules>

No .write rule allowed the operation.
Write was denied.

为什么在插入的数据将appSecret设置为123时拒绝写入操作?

Frank回答后更新

安全性不仅包括插入的检查数据,还包括插入的位置。因此,在我的上述规则中,我试图说当您在/处插入数据时,请确保用户已通过身份验证,或者插入的数据包含值appSecret的子级123,其值设置为/queue/tasks/23232我想在地点/插入数据。所以,基本上我在{ 'queue': { 'tasks': { '23232': { "appSecret":"123", "task":"GET_AUTH_TOKEN" } } } } 插入的是

appSecret

因此,插入的新数据不包含值为123的子{ "rules": { ".read": "auth != null", "queue": { "tasks" : { "$taskId" : { ".write": "newData.child('appSecret').val() == '123'", }, ".indexOn": "_state" } } } } 。我将规则更新为

write

允许写入操作。当然,现在您还需要为数据库中的其他位置添加write规则,因为根据上述规则,任何其他位置都不允许hashmap

1 个答案:

答案 0 :(得分:2)

您正试图将{"appSecret":"123","task":"GET_AUTH_TOKEN"}写入路径/queue/tasks/23232。因此,您最终将123写入/queue/tasks/23232/appSecret

/的写规则表示用户必须是身份验证,或者新数据必须包含值/appSecret的{​​{1}}。由于情况并非如此,因此拒绝写入。