javascript - Firebase 规则 - 只读查询中的值

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

我将用户名单独存储在数据库的验证部分中。只有用户名,这样用户注册时可以输入用户名,然后在注册前查看该用户名是否可用。 现在的规则是 ".read": true ,因此基本上允许任何人轻松访问数据库中的所有用户名。我想阻止这种情况,但我不知道该怎么做,因为我无法使用 auth != null 规则,因为用户尚未创建。

我唯一的想法是只允许读取所请求的用户名,即某些内容

 firebase.database().ref('Validations/Usernames')
            .orderByChild('name')
            .equalTo(username)
            .once('value')
            .then(snapshot => ....

然后使用这样的规则:

"$name": {
   ".read": "query.equalTo == $name"
}

即允许只读从客户端检查的用户名。现在,这失败了,因为对于所有其他人来说,它都无法通过 orderByChild 进行检查。

是否有一些类似的方法允许只读取请求从客户端读取的值?或者也许我应该在他创建帐户之前通过其他方式进行用户名验证?

最佳答案

如果您只想允许用户检查他们输入的用户名是否已被认领,则他们不会读取整个 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()

关于javascript - Firebase 规则 - 只读查询中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58791583/

相关文章:

firebase - 找不到 com.crashlytics.sdk.android :crashlytics:17. 2.2

firebase - 在 Firebase 中访问嵌套数据

javascript - 快速 Javascript 考虑了 document.getElementByClassName 来修复错误

Swift Firebase 按子级的子级查询

firebase - 为什么身份验证不能在自己的域上工作,但可以在 firebase 的域上工作?

android - Cordova -插件-fcm : Cannot find name 'FCMPlugin'

Javascript将字符串与模式匹配并在匹配的字符串中插入一些文本

c# - IE 不适用于 javascript onclick 事件...适用于 FF 和 Chrome

javascript - 在 React 组件中渲染时模态不显示

ios - 如何在一个 block 中从一个 Firebase 查询中获取所有结果