在Firebase中实现删除推文和喜欢/ upvote功能

时间:2013-03-31 10:02:49

标签: javascript firebase firebase-security

继续本线程,在HN:https://news.ycombinator.com/item?id=5462769

阅读firefeed规则文件为我回答了很多问题,除了这两个:

  1. 不允许编辑现有推文(“。write”:“!data.exists()”)。如何使其不可编辑,但可由作者删除?
  2. 您如何安全地处理喜欢/不喜欢或提升/弃用?如果用户之前没有修改过这个,那么写一个如果经过身份验证,验证增加/减少一个?那会怎么样?是否必须有一个编辑此内容的人员列表?我对这个特定的用例非常好奇,因为它似乎在许多应用程序中很常见,但在我看来,在firebase中实现起来会非常复杂吗?

2 个答案:

答案 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计数。