【问题标题】:Implementing remove tweet and like/upvote functionality in Firebase在 Firebase 中实现删除推文和点赞/点赞功能
【发布时间】:2013-03-21 15:13:55
【问题描述】:

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

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

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

【问题讨论】:

    标签: javascript firebase firebase-security


    【解决方案1】:

    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"
    

    【讨论】:

    • 非常感谢您的回答,在我看来,写规则是纯艺术,很抱歉“修改”位不够清楚。以您描述的方式实现的支持将允许用户无休止地支持帖子,而通常,此类功能仅限于每个用户一次。所以我很好奇,你怎么会只让用户投票一次,而不是让两次投票,而是让他们删除他们的投票和反对票。我知道,我将如何在关系数据库中实现这一点,只是好奇,在 firebase 中实现这一点的最佳方法是什么。
    • 我已经为我们的测试版实现了这个;它比你想象的要简单;让我补充一下。
    • 这似乎不正确。在最后的新验证规则中,用户仍然可以通过拒绝将他们的用户 ID 添加到“投票”集合中来无休止地增加投票总数。 (因此,每次该人第一次投票时,它都会认为他们可能只是在“投票”集合中隐瞒了他们的名字)。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2014-08-03
      • 1970-01-01
      • 1970-01-01
      • 2016-02-23
      • 2020-04-27
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 2019-03-10
      相关资源
      最近更新 更多