通过密钥从查找中删除Firebase

时间:2017-08-05 22:42:21

标签: javascript angular firebase firebase-realtime-database

这是一个非常简单的问题。我有一个查找位置,我存储是否已使用用户名。格式是用户名:userid,当我不想保持我的数据库干净但它确实很好。为了阻止它不断增长,我添加了它 - 它可以工作,但感觉就像一个非常黑客的方法。

this.db.database.ref('usernames').on('child_added',snapshot => {
  if (snapshot.val() === userId && snapshot.key !== username) {
    this.db.object(`usernames/${snapshot.key}`).remove();
  }
});

它可以正常工作我想要它做但如果你知道我的意思,感觉非常“非常”。

必须有一种更好的方法来删除所有键的记录!== new_key和value === $ uid。

1 个答案:

答案 0 :(得分:1)

我想我明白你在做什么。您有一个名为" usernames"的数据库分支,您可以在其中拥有键值对列表。键是用户名,由用户组成的简短易记的名称,例如" bob1"或者" darthVader111"。对于每个值,该值是用户的Firebase UserId,这是长期不可记录的代码,例如" 4jkh53kjh543g3ij4534k5j43h5k"。

database
    usernames
        bob1 (key): 4jkh53kjh543g3ij4534k5j43h5k (value)
        darthvader (key): 098769456435k6645kjhlsdfkjh (value)
        ...

您的代码正在等待对数据库的用户名分支的任何添加,并查看添加的键值对。如果您当前以Firebase UserID" 4jkh53kjh543g3ij4534k5j43h5k"登录,并且您的用户名为" bob1",则代码会看到添加了一个新的子项,其用户名为" Roberto&# 34;,使用相同的Firebase UserID" 4jkh53kjh543g3ij4534k5j43h5k",然后它知道用户(其Firebase用户ID是常量)必须更改他/她的用户名。

因此删除(旧的)用户名条目是合理的,{" bob1":" 4jkh53kjh543g3ij4534k5j43h5k"}。

我认为它很巧妙,因为它不需要搜索。但是,它不是更整洁,不必等待" child_added",而是在创建新用户名条目的代码中执行此操作?例如:

  let userObject={};
  userObject[newUserName]=userId;

  this.db.object(`usernames/${oldUserName}`).remove()
  .then(this.db.object("usernames").update(userObject))

安全问题

看起来你让最终用户在他/她喜欢的任何地方有效地写入usernames树。您可以使用firebase服务器上的验证规则使其更安全。

特别是,您可能希望阻止最终用户(可能能够操纵javascript以删除" .remove()"调用)接管大量用户ID

这方面的一个解决方案是拥有两个username数据库:其中一个是密码完成的,用户名:userId,另一个是userId:username。您可以设置更新必须

的验证规则
  • 使用相同的数据更新两个子树(显然,键和值反转),
  • 用户名不能存在于"用户名:userId"子树
  • userId不能存在于" userId:username"子树

这样,如果用户删除" .remove()"在javascript中调用,他/她将无法接管新的userId。

相关问题