我开始使用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
。
答案 0 :(得分:2)
您正试图将{"appSecret":"123","task":"GET_AUTH_TOKEN"}
写入路径/queue/tasks/23232
。因此,您最终将123
写入/queue/tasks/23232/appSecret
。
/
的写规则表示用户必须是身份验证,或者新数据必须包含值/appSecret
的{{1}}。由于情况并非如此,因此拒绝写入。