唯一用户名的Firebase数据库规则
我正在尝试创建一个使用Firebase数据库存储用户信息的网站。我想使用唯一的用户名。我有两个索引,一个用于用户,另一个用于用户名 我的数据库结构如下:唯一用户名的Firebase数据库规则,firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,我正在尝试创建一个使用Firebase数据库存储用户信息的网站。我想使用唯一的用户名。我有两个索引,一个用于用户,另一个用于用户名 我的数据库结构如下: users { $uid { username: "username1", gender: "xyz" email: "xyz" } }, usernames { "username1": $uid" } 用户使用$uid声明用户名 以下是我的规则: { "rules": { "users"
users {
$uid {
username: "username1",
gender: "xyz"
email: "xyz"
}
},
usernames {
"username1": $uid"
}
用户使用$uid声明用户名
以下是我的规则:
{
"rules": {
"users": {
"$uid": {
".write": "auth !== null && auth.uid === $uid",
".read": "auth !== null && auth.uid === $uid",
"username": {
".validate": "
!root.child('usernames').child(newData.val()).exists() ||
root.child('usernames').child(newData.val()).val() == $uid"
}
}
},
"usernames" : {
".write": "!data.exists() && auth!= null",
".validate": "newData.val() == auth.uid" <---- I can't get this too work
}
}
}
{
“规则”:{
“用户”:{
“$uid”:{
“.write”:“auth!==null&&auth.uid===$uid”,
“.read”:“auth!==null&&auth.uid===$uid”,
“用户名”:{
“.validate”:”
!root.child('usernames').child(newData.val()).exists()||
root.child('usernames').child(newData.val()).val()==$uid
}
}
},
“用户名”:{
“.write”:“!data.exists()&&auth!=null”,
“.validate”:“newData.val()==auth.uid”如果我迟到了,很抱歉,但我遇到了类似的问题,我将我的用户名规则更改为以下规则,这就成功了:
"usernames" : {
"$username": {
".write": "!data.exists() && auth!= null && newData.val() == auth.uid"
}
},
}
很抱歉,如果我迟到了,但我遇到了类似的问题,我将我的用户名规则更改为以下规则,从而达到了目的:
"usernames" : {
"$username": {
".write": "!data.exists() && auth!= null && newData.val() == auth.uid"
}
},
}
一旦您希望允许用户更改用户名,接受的答案就会引起问题
通过稍微更改数据库结构,您可以轻松地在firebase中管理用户名。您还可以允许用户更改其用户名
数据库:
usernames: {
username1: {
owner: "userId1"
},
username2: {
owner: "userId2"
},
...
}
以下规则将:
- 停止任何用户更改/删除其他用户的用户名
- 让新用户创建一个用户名
- 允许用户通过删除旧用户名并创建新用户名来更改用户名
(仅为可读性而在换行符上拆分)
此更新将创建一个用户:
const toAdd = {}
toAdd[`usernames/${username}`] = { owner: userId };
firebase.database().ref().set(toAdd)
此更新将更改用户用户名:
const update = {}
update[`usernames/${previousUsername.toLowerCase()}`] = null;
update[`usernames/${newUsername.toLowerCase()}`] = { owner: userId };
firebase.database().ref().update(update)
在您的代码中,您还应该在发送更新之前查询数据库以检查用户名是否存在
为什么我避免使用username:userId
方法:
你说
编辑#2我做了一些研究,根据我所能说的,我在文档中找到的所有内容都谈到需要在.val()之前使用.child(),但我需要.child接受一个变量,而不是一个设置的用户名
我相信这是正确的。对于您的用户名设置:
usernames {
"username1": userId1,
"username2": userId2,
...
}
描述在请求中发送密钥信息的方法:
ref.update({
_username: "username3",
username3: "userId3",
})
然后可以使用如下规则检查数据库中是否存在用户名
data.child(newData.child('_username').val()).exists()
但是,在您的用户名设置中,您将使用此更新覆盖其他用户名。为避免此情况,您需要在用户名路径上设置新数据,usernames/username3=userId3
。但您不能这样设置,因为您又回到了规则中没有可引用密钥的问题
您需要创建一个无意义的结构,例如:
usernames: {
username1: {
_username: "username1",
userId: "userId1"
}
}
因此,我选择了一个更简单,但不幸的是,我在开始时描述的用户名数据库设置稍不美观。一旦您希望允许用户更改用户名,接受的答案就会引起问题
通过稍微更改数据库结构,您可以轻松地在firebase中管理用户名。您还可以允许用户更改其用户名
数据库:
usernames: {
username1: {
owner: "userId1"
},
username2: {
owner: "userId2"
},
...
}
以下规则将:
- 停止任何用户更改/删除其他用户的用户名
- 让新用户创建一个用户名
- 允许用户通过删除旧用户名并创建新用户名来更改用户名
(仅为可读性而在换行符上拆分)
此更新将创建一个用户:
const toAdd = {}
toAdd[`usernames/${username}`] = { owner: userId };
firebase.database().ref().set(toAdd)
此更新将更改用户用户名:
const update = {}
update[`usernames/${previousUsername.toLowerCase()}`] = null;
update[`usernames/${newUsername.toLowerCase()}`] = { owner: userId };
firebase.database().ref().update(update)
在您的代码中,您还应该在发送更新之前查询数据库以检查用户名是否存在
为什么我避免使用username:userId
方法:
你说
编辑#2我做了一些研究,根据我所能说的,我在文档中找到的所有内容都谈到需要在.val()之前使用.child(),但我需要.child接受一个变量,而不是一个设置的用户名
我相信这是正确的。对于您的用户名设置:
usernames {
"username1": userId1,
"username2": userId2,
...
}
描述在请求中发送密钥信息的方法:
ref.update({
_username: "username3",
username3: "userId3",
})
然后可以使用如下规则检查数据库中是否存在用户名
data.child(newData.child('_username').val()).exists()
但是,在您的用户名设置中,您将使用此更新覆盖其他用户名。为避免此情况,您需要在用户名路径上设置新数据,usernames/username3=userId3
。但您不能这样设置,因为您又回到了规则中没有可引用密钥的问题
您需要创建一个无意义的结构,例如:
usernames: {
username1: {
_username: "username1",
userId: "userId1"
}
}
因此,我选择了一个更简单,但不幸的是,我在一开始描述的用户名数据库设置稍不美观。你说你无法让它工作,但你没有说它如何工作。它是否失败或通过验证,而不管其值如何?我与cartant在一起:乍一看,规则看起来不错。失败的原因是什么这样做有助于查看当前的JSON(作为文本,无屏幕截图)写操作失败了。很抱歉不够清晰。我目前在用户名验证上失败了。你说你不能让它工作,但你没有说它是如何工作的。它失败了还是通过了验证,不管它的值是多少?我和cartant在一起:乍一看,规则看起来不错。失败了什么?为什么像这样,它有助于查看当前的JSON(作为文本,没有屏幕截图)和失败的写入操作。很抱歉不够清晰。我目前在验证用户名方面失败。