【问题标题】:how to prevent double upvote react- firebase如何防止双重投票反应-firebase
【发布时间】:2018-09-08 06:39:37
【问题描述】:

我正在努力防止在 firebase 中进行双重投票。我的想法是在 firebase 中创建一个投票对象,然后在每次有人投票时添加一个 user_id 布尔值。所以counterTips>votes>User_id1: true> UserId2: True.

这些是我的安全规则:

{

  "rules": {
    ".read": true,
    ".write": true,
      "CounterTips": {
     "votes": {
                "$uid": {
                    ".write": "auth.uid != null && auth.uid === $uid"
                }
              }
            }
  }


}

这就是我的数据库的结构方式

CounterTips 

 user_id: "rI9m9GEkyKhopAhaDNC8GNWPS943"

 vote: 5, 

 votes: 
1) bbz9MLo1u7T7zxugmHA806nMof93: true

我试图将当前用户 ID 推送到投票对象中,但我只是得到一个静态字符串,上面写着 user_id: true。如何将实际的 user_id 推送到投票并防止该用户在安全规则中再次投票?

     upvotePost(key, vote, user_id) {

if (this.state.user_id !=null )
{

CounterTipsref.child("votes/${this.state.user_id}").once("value",snapshot => {
    if (snapshot.exists()){
      const userData = snapshot.val();
      console.log("exists!", userData);
    }


});
}

 else{
alert(this.state.user_id);
let user_id= this.state.user_id;
let votes = { [user_id]: true};

vote++;
CounterTipsRef.child(key).update({ 'vote': vote, 'votes': votes }); 
}
}
if (this.state.user_id==null) {

this.props.history.push('/login');
}


  }
}

【问题讨论】:

  • 我对此的想法一直是:一个布尔值实际上传达了 3 个状态(而不是 2 个),即 - truefalsenull。换句话说,属性是用户uidtrue表示赞成,false表示反对,不存在(null)表示没有投票。

标签: javascript reactjs firebase firebase-realtime-database firebase-security


【解决方案1】:

你的问题是你使用这个符号:

let votes = { user_id: true};

这里的user_id 被视为属性的名称,而不是变量持有属性的名称。快速解决方法是使用[] 表示法:

let votes = { };
votes[user_id] = true;

【讨论】:

  • 好的,那么现在我如何正确的安全规则来防止用户投票两次?
  • 最简单的方法是不保留单独的计数器。如果你只有投票的集合,并且每个用户只能在自己的 UID 下投票,那么投票自动是唯一的。您可以通过下载votes 并在客户端中计算选票来简单地计算选票。如果您想保留一个单独的计数器,并确保对其的更新与人们添加/删除其 UID 一致,请在此处查看我的答案:stackoverflow.com/questions/37954217/…
猜你喜欢
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 1970-01-01
  • 2013-05-27
  • 1970-01-01
相关资源
最近更新 更多