我将用户名分别存储在数据库的验证部分中。只有用户名,因此在用户注册时,他可以输入用户名,并在注册之前查看用户名是否可用。 现在的规则是“ .read”:true,这样基本上可以使任何人都可以轻松访问数据库中的所有用户名。我想防止这种情况,但是我不确定该怎么做,因为我不能使用auth!= null规则,因为尚未创建用户。
我唯一的想法是只允许读取所请求的用户名,即某些内容
firebase.database().ref('Validations/Usernames')
.orderByChild('name')
.equalTo(username)
.once('value')
.then(snapshot => ....
然后使用如下规则:
"$name": {
".read": "query.equalTo == $name"
}
ie允许从客户端检查的用户名只读。现在,这失败了,因为对于所有其他人来说,使用orderByChild进行检查都无法访问这些内容。
是否有一些类似的方法可以只读取从客户端读取的值?或者,也许还有其他完全我可以在他创建帐户之前进行用户名验证的方法?
答案 0 :(得分:1)
如果仅允许用户检查所键入的用户名是否已被声明,则他们不会读取整个Validations/Usernames
节点上的访问权限。相反,他们只需要对该特定子级下的特定子级进行读访问。
为此,请确保使用用户名作为Validations/Usernames
下的键,例如:
"Validations": {
"Usernames": {
"CosmicSeizure": "uidOfCosmicSeizure",
"puf": "uidOfPuf"
}
}
使用上述规则,您的规则可以是:
"Validations": {
"Usernames": {
"$name": {
".read": true
}
}
}
然后您可以检查用户名是否存在:
firebase.database().ref('Validations/Usernames')
.child(username)
.once('value')
.then(snapshot => ....
然后检查是否为snapshot.exists()
。