【问题标题】:Firebase rules with Bolt compiler带有 Bolt 编译器的 Firebase 规则
【发布时间】:2015-12-03 01:41:34
【问题描述】:

我正在使用 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。

顺便说一句,我无法想象在没有使用 Bolt 的情况下编写规则。与尝试手动操作相比有了很大进步。

【问题讨论】:

    标签: firebase firebase-security


    【解决方案1】:

    在此处查看讨论https://github.com/firebase/bolt/issues/87

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

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

    如果您不使用多位置更新,并且希望 Bolt 生成更简单的规则,则可以使用 prior(root) 而不是 root

    【讨论】:

    • 我认为这可能是新事物与现有事物。感谢您的解释。你知道 Bolt 是否支持或将支持让 cmets 继承到 json 中?
    猜你喜欢
    • 1970-01-01
    • 2016-10-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-13
    • 1970-01-01
    • 2015-06-17
    • 2016-02-23
    • 2013-09-20
    相关资源
    最近更新 更多