6

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

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

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

2 回答 2

9

1.作者不可编辑但可删除

".write": "!data.exists() || (!newData.exists() && data.child('author') === auth.id)"

2. 点赞/点赞

在客户端上,使用允许您安全地增加值的事务:

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 存储它们。用户可以通过删除记录来删除他们的投票。

我建议将它们存储在与 spark 不同的路径中,并且仍然保持简单的增量(被投票赞成/反对的消息),因为您不希望每次获取投票者时都必须检索整个投票者列表火花。

安全规则如下所示:

"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"
于 2013-03-31T14:34:35.107 回答
0

现在 Firebase Functions 已向公众发布(测试版),这似乎是一个不错的选择:https ://firebase.googleblog.com/2017/03/introducing-cloud-functions-for-firebase.html

这个想法是让每个用户都可以通过键将他们的名字添加到推文的“upvoters”集合中。他们可以创建或删除他们的条目——但只能有一个,因为它是密钥,并且安全规则只允许控制他们的一个密钥。

当要查找“赞成票数”时,客户可以获得赞成票的完整列表并计算数字。但是,为了性能起见,我们创建了一个 Firebase 函数,每当添加或删除赞成票条目时就会触发该函数。

然后它所做的就是增加或减少推文上的“upvote count”属性。这和以前一样,只是我们制定了一个安全规则,只允许云托管的 Function 修改该字段。因此,修改始终是可信且安全的,并且无需客户端接收支持者列表以获取支持者计数。

于 2017-03-10T07:48:54.180 回答