我正在尝试保护我的firebase数据库以允许创建新记录,但不允许删除现有记录。最终,我计划在我的应用程序中使用Firebase身份验证,并允许用户更新现有记录,如果他们是作者,但我试图让简单的案例先工作。
然而!无论我在数据库规则模拟器中尝试什么,尽管文档seems to suggest,data.exists()
的值似乎总是如此。根据{{3}}我可以理解的内容,变量data
表示数据库中的记录,就像它在操作发生之前所做的那样。也就是说,对于创建,data
将不存在,对于更新/删除,data
将引用数据库中存在的真实记录。 这似乎并非如此,我实际上怀疑Firebase中存在错误,就像在我的数据库上设置以下规则一样,不允许所有写入操作:
{
"rules": {
".read": true,
".write": "!data.exists()"
}
}
无论我将哪些值放入模拟器,无论是位置还是数据。我甚至写了一个小的EmberJS应用程序来验证模拟器是否说出了真相,它也被拒绝了所有写操作的许可。
我真的不知道从哪里开始,因为我几乎没有尝试过。我尝试删除我的数据库中的所有记录,这让模拟器认为它可以执行写操作,但我的测试应用程序仍然得到PERMISSION_DENIED,所以我不知道是什么导致了那里的不一致。
我对预定义data
变量的理解是否正确?如果是这样,为什么我不能写出我想要的规则?我已经看到the documentation字面上试图实现我的“仅创建,不删除”规则,似乎符合我的理解。
最后一点:我正在一个全新的Firebase项目中尝试这个,只需要上面的规则,并且只有几条垃圾数据记录在我的数据库周围。
答案 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()