类似的写入如 何在Firebase安全规则中给出不同的结果?

问题描述 投票:0回答:2

有人可以解释为什么,在测试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
                }
            }
        }
    }
}
firebase firebase-realtime-database firebase-security firebase-security-rules
2个回答
0
投票

您的规则是拒绝在状态节点下或更深处的所有位置写入。

所以任何写作

/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都需要一个只有您才有的服务帐户密钥文件。因此它们是安全的。他们将为您提供管理员访问权限,并始终绕过所有位置的所有安全规则。


0
投票

在您给出的示例中,您正在写入不同的位置,而firebase安全性将首先查看您正在编写的位置以检查规则。

写2

模拟器位置:/ users / id123 / 模拟器数据(JSON):{“state”:{“data”:“example}}

在这里,您要写入/users/id123/,firebase将检查写入规则的位置,在您的情况下不存在,因此它将使用默认的".write":false

要编写规则,您必须确保将它们设置在正确的级别。

看看firebase security authorization(谁可以阅读/阅读)和validation(可以写什么)。

© www.soinside.com 2019 - 2024. All rights reserved.