Javascript 在Firebase中实现删除tweet和like/upvote功能
从该线程继续,在HN上: 阅读firefeed规则文件为我回答了很多问题,除了以下两个问题:Javascript 在Firebase中实现删除tweet和like/upvote功能,javascript,firebase,firebase-security,Javascript,Firebase,Firebase Security,从该线程继续,在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总计数。(因此,每当该人第一次投票时,它都会认为,事实上,他们可能只是在“选票”收集中隐瞒了自己的姓名)。