使用Bolt编译器的Firebase规则

时间:2015-12-02 17:04:24

标签: firebase firebase-security

我使用Firebase Bolt编译器生成规则,并且我注意到它生成的读取和写入不同。

我写了一个函数,查看某个节点,看看那里是否有有效数据。然后我在不同的部分使用该功能。

所以函数就像

isValidInvite(r_id, invite_id) = root['invites'][r_id][invite_id] != null;

当我使用它时:

read() = isValidInvite($resource_id, $invite_id);
write() =isValidInvite($resource_id, $invite_id);

Bolt生成的json是

".read": "root.child('invites').child($resource_id).child($invite_id).val() != null",
".write":"newData.parent().parent().parent().parent().child('invites').child($resource_id).child($invite_id).val() != null"

我相信两者都是对的吗?去看看某个节点,确保那里有数据。 "写"需要很长的路才能到达同一个节点。在树上,然后向下。 规则有效,我实际上不会使用相同的函数进行读写,但我试图更好地理解Firebase规则和Bolt。

顺便说一句,在短时间内使用后,我无法想象在没有博尔特的情况下编写规则。试图手工完成它的巨大进步。

1 个答案:

答案 0 :(得分:4)

请参阅此处的讨论https://github.com/firebase/bolt/issues/87

原因很微妙(不明显):要支持多位置更新,您需要能够编写引用&#34; new&#34;的规则。日期的价值。 Bolt中的标准是在写入和验证规则中,thisroot引用是newData值(在读取规则中,this和root是data - old / existing - values)。< / p>

理想情况下,我们在JSON规则中会有一个newRoot变量 - 因此我们可以在这些情况下将root转换为newRoot。由于我们还没有(还),Bolt使用newData.parent()....生成等效规则(即对newData的相对引用)。

如果您没有使用多地点更新,并且希望Bolt生成更简单的规则,则可以使用prior(root)代替root