Firebase数据库规则 - `data.exists()`似乎总是如此,可能是bug?

时间:2017-07-06 09:28:35

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

我正在尝试保护我的firebase数据库以允许创建新记录,但不允许删除现有记录。最终,我计划在我的应用程序中使用Firebase身份验证,并允许用户更新现有记录,如果他们是作者,但我试图让简单的案例先工作。

然而!无论我在数据库规则模拟器中尝试什么,尽管文档seems to suggestdata.exists()的值似乎总是如此。根据{{​​3}}我可以理解的内容,变量data表示数据库中的记录,就像它在操作发生之前所做的那样。也就是说,对于创建,data将不存在,对于更新/删除,data将引用数据库中存在的真实记录。 这似乎并非如此,我实际上怀疑Firebase中存在错误,就像在我的数据库上设置以下规则一样,不允许所有写入操作

{
  "rules": {
    ".read": true,
    ".write": "!data.exists()"
  }
}

无论我将哪些值放入模拟器,无论是位置还是数据。我甚至写了一个小的EmberJS应用程序来验证模拟器是否说出了真相,它也被拒绝了所有写操作的许可。

我真的不知道从哪里开始,因为我几乎没有尝试过。我尝试删除我的数据库中的所有记录,这让模拟器认为它可以执行写操作,但我的测试应用程序仍然得到PERMISSION_DENIED,所以我不知道是什么导致了那里的不一致。

我对预定义data变量的理解是否正确?如果是这样,为什么我不能写出我想要的规则?我已经看到the documentation字面上试图实现我的“仅创建,不删除”规则,似乎符合我的理解。

最后一点:我正在一个全新的Firebase项目中尝试这个,只需要上面的规则,并且只有几条垃圾数据记录在我的数据库周围。

1 个答案:

答案 0 :(得分:6)

因为您已将<Setter Property="ItemTemplate"> <Setter.Value> <DataTemplate> <Label Content="{What Binding to put here to get ValueMemberPath's value}"/> </DataTemplate> </Setter.Value> 放在数据库的根位置,所以!data.exists()指的是整个数据库。只有在数据库完全为空时,您才能写入数据库。

您表示只运行数据库中的几条垃圾数据记录来运行测试。这些记录将导致data成立。

您可以通过将树中的data.exists()规则放置在您要求不存在任何数据的特定位置来实现目标。这通常在带有通配符键的位置完成,如您链接的示例所示:

!data.exists()