Firebase 安全规则检查新数据的值以进行身份验证
Firebase security rule checking value of new data to authenticate
我开始使用 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"
}
}
}
}
因此,插入的新数据不包含值为 123
的子 appSecret
。我将规则更新为
{
"rules": {
".read": "auth != null",
"queue": {
"tasks" : {
"$taskId" : {
".write": "newData.child('appSecret').val() == '123'",
},
".indexOn": "_state"
}
}
}
}
并且写入操作被允许。当然,现在您还需要为数据库中的其他位置添加 write
规则,因为使用上述规则,任何其他位置都不允许使用 write
。
您正在尝试将 {"appSecret":"123","task":"GET_AUTH_TOKEN"}
写入路径 /queue/tasks/23232
。所以你最终写 123
到 /queue/tasks/23232/appSecret
.
您的 /
写入规则规定用户必须经过身份验证或新数据必须包含 /appSecret
且值为 123
。由于情况并非如此,因此写入被拒绝。
我开始使用 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"
}
}
}
}
因此,插入的新数据不包含值为 123
的子 appSecret
。我将规则更新为
{
"rules": {
".read": "auth != null",
"queue": {
"tasks" : {
"$taskId" : {
".write": "newData.child('appSecret').val() == '123'",
},
".indexOn": "_state"
}
}
}
}
并且写入操作被允许。当然,现在您还需要为数据库中的其他位置添加 write
规则,因为使用上述规则,任何其他位置都不允许使用 write
。
您正在尝试将 {"appSecret":"123","task":"GET_AUTH_TOKEN"}
写入路径 /queue/tasks/23232
。所以你最终写 123
到 /queue/tasks/23232/appSecret
.
您的 /
写入规则规定用户必须经过身份验证或新数据必须包含 /appSecret
且值为 123
。由于情况并非如此,因此写入被拒绝。