Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Firebase中实现删除tweet和like/upvote功能_Javascript_Firebase_Firebase Security - Fatal编程技术网

Javascript 在Firebase中实现删除tweet和like/upvote功能

Javascript 在Firebase中实现删除tweet和like/upvote功能,javascript,firebase,firebase-security,Javascript,Firebase,Firebase Security,从该线程继续,在HN上: 阅读firefeed规则文件为我回答了很多问题,除了以下两个问题: 不允许编辑现有tweet(“.write”:“!data.exists()”)。如何使其不可编辑,但可由作者删除 您将如何安全地处理喜欢/不喜欢或向上投票/向下投票?如果用户以前没有修改过,那么在经过身份验证的情况下写入,验证是否增加/减少1?那怎么办?是否一定要有编辑此内容的人员的子列表?我真的很好奇这个特定的用例,因为它在许多应用程序中似乎很常见,但在我看来,在firebase中实现它真的很复杂吗

从该线程继续,在HN上:

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

  • 不允许编辑现有tweet(“.write”:“!data.exists()”)。如何使其不可编辑,但可由作者删除
  • 您将如何安全地处理喜欢/不喜欢或向上投票/向下投票?如果用户以前没有修改过,那么在经过身份验证的情况下写入,验证是否增加/减少1?那怎么办?是否一定要有编辑此内容的人员的子列表?我真的很好奇这个特定的用例,因为它在许多应用程序中似乎很常见,但在我看来,在firebase中实现它真的很复杂吗

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

    我建议将它们存储在sparks之外的单独路径中,并且仍然保持一个简单的增量(即被投票的消息),因为您不希望每次获取sparks时都必须检索整个投票者列表

    安全规则如下所示:

    "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功能已向公众发布(测试版),这似乎是一个不错的选择:

    其想法是允许每个用户通过按键将自己的名字添加到推特的“UpVorters”集合中。他们可以创建或删除他们的条目-- 但是只能有一个,因为它是按密钥的,安全规则只允许控制他们的一个密钥

    当发现“向上投票计数”时,客户可以获得向上投票人的完整列表并统计数字。但是,为了提高性能,我们创建了一个Firebase函数,每当添加或删除upvote条目时都会触发该函数


    它所做的只是增加或减少推特上的“upvote count”属性。这与之前相同,只是我们制定了一个安全规则,只允许云托管函数修改此字段。因此,修改始终是可信和安全的,客户无需仅为了获得upvote计数而接收UpVoter列表。

    非常感谢您的回答,在我看来,书写规则是纯粹的艺术,很抱歉“修改”位不够清晰。向上投票,按照您描述的方式实现,将允许用户无休止地向上投票帖子,而通常,这种功能仅限于每个用户一次。所以我很好奇,你怎么能只让用户向上投票一次,不让用户向上投票两次,而是让用户删除他们的投票和向下投票。我明白,我是如何在关系数据库中实现这一点的,只是好奇,在firebase中实现这一点的最佳方式是什么;这比你想象的要简单;让我补充一点,这似乎不正确。在最后的新验证规则中,用户仍然可以通过拒绝将其用户id添加到“投票”集合中,无休止地增加upvote总计数。(因此,每当该人第一次投票时,它都会认为,事实上,他们可能只是在“选票”收集中隐瞒了自己的姓名)。