Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
唯一用户名的Firebase数据库规则_Firebase_Firebase Realtime Database_Firebase Security - Fatal编程技术网

唯一用户名的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"

我正在尝试创建一个使用Firebase数据库存储用户信息的网站。我想使用唯一的用户名。我有两个索引,一个用于用户,另一个用于用户名

我的数据库结构如下:

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(作为文本,没有屏幕截图)和失败的写入操作。很抱歉不够清晰。我目前在验证用户名方面失败。