有人可以解释为什么,在测试Firebase安全规则时,下面两个模拟写入我认为基本相同会给出不同的结果吗?
WRITE1
模拟器位置:/ users / id123 / state 模拟器数据(JSON):{“data”:“example}
写2
模拟器位置:/ users / id123 / 模拟器数据(JSON):{“state”:{“data”:“example}}
写1拒绝在以下规则中的“state”:,“。write”行中的wright。
写2跳过“state”:,“。write”行。
这是一个问题,因为我在一个JSON更新及其跳过规则中更新了多个路径。
有谁知道为什么?
{
"rules":{
"users":{
"$userId":{
"state":{
".write":false,
".read":false
}
}
}
}
}
您的规则是拒绝在状态节点下或更深处的所有位置写入。
所以任何写作
/Users/uid/state
以及各州的任何规则
/Users/uid/state/foo/bar
将被否认。
但是如果你把数据写到
/Users/uid
该规则不适用,因为它不在状态节点或在状态节点下,它是一个较浅的节点,没有规定任何规则。你可以把你的规则放在
{
"rules":{
"users":{
"$userId":{
".write":false,
".read":false
}
}
}
}
上述规则将阻止对uid节点下的所有路径进行写入。此外,如果您使用REST api或admin api,则所有规则都将被绕过
REST API和ADMIN API都需要一个只有您才有的服务帐户密钥文件。因此它们是安全的。他们将为您提供管理员访问权限,并始终绕过所有位置的所有安全规则。
在您给出的示例中,您正在写入不同的位置,而firebase安全性将首先查看您正在编写的位置以检查规则。
写2
模拟器位置:/ users / id123 / 模拟器数据(JSON):{“state”:{“data”:“example}}
在这里,您要写入/users/id123/
,firebase将检查写入规则的位置,在您的情况下不存在,因此它将使用默认的".write":false
。
要编写规则,您必须确保将它们设置在正确的级别。
看看firebase security authorization(谁可以阅读/阅读)和validation(可以写什么)。