继续本线程,在HN:https://news.ycombinator.com/item?id=5462769
阅读firefeed规则文件为我回答了很多问题,除了这两个:
答案 0 :(得分:8)
<强> 1。不可编辑但可由作者删除
".write": "!data.exists() || (!newData.exists() && data.child('author') === auth.id)"
<强> 2。喜欢/ Upvoting 强>
在客户端上,使用允许您安全递增值的事务:
ref.transaction(function(currentValue) {
return (currentValue||0)+1;
}, function(error) {
if( error ) /* failed too many times */
else /* it worked */
});
安全性也很简单:
".validate": "newData.isNumber() && newData.val() === data.val()+1"
2.5确保独特投票
我不确定这意味着什么;记录无法编辑,如果可以的话,只有作者能够这样做;所以我在这个上下文中并没有真正理解“修改”:“如果用户之前没有修改过它?那会怎么样?”
为确保投票的唯一性,您只需按用户ID存储它们即可。用户可以通过删除记录来删除他们的投票。
我建议将这些存储在一个不同于火花的单独路径中,并且仍然保持一个简单的增量(被上调/下调的消息),因为您不希望每次都必须检索整个选民列表你拿到了火花。
安全规则如下:
"votes": {
"$spark_id": {
"$vote": {
".read": "$vote === auth.id",
".write": "$vote === auth.id",
// to allow downvoting in addition to up or delete, just add -1 here
".validate": "newData.val() === 1 || newData.val() === null"
}
}
}
现在为增量的验证规则添加一个检查:
".validate": "!root.child('votes').child($spark_id).child(auth.id).exists() && newData.isNumber() && newData.val() === data.val()+1"
答案 1 :(得分:0)
现在Firebase功能已经向公众发布(测试版),这似乎是一个不错的选择:https://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html
这个想法是允许每个用户按键将他们的名字添加到推文的“upvoters”集合中。他们可以创建或删除他们的条目 - 但只能有一个,因为它是按键,安全规则只允许控制他们的一个键。
当发现“upvote count”时,客户可以获取完整的upvoters列表并计算该号码。但是,为了性能,我们创建了一个Firebase函数,只要添加或删除了upvote条目,就会触发该函数。
它所做的就是增加或减少推文上的“upvote count”属性。这和以前一样,除了我们制定一个安全规则,只允许云托管的函数修改此字段。因此,修改始终是可信和安全的,并且无需客户端接收upvoters列表以获得upvote计数。