【问题标题】:Firebase Realtime Database rules for specific node of structure特定结构节点的 Firebase 实时数据库规则
【发布时间】:2022-01-24 21:47:47
【问题描述】:

在创建新用户之前,我想检查创建 username 属性是否已存在于 Firebase 数据库中。

检查功能是:

let databaseRef = Database.database().reference()
databaseRef.child("users").queryOrdered(byChild: "username").queryEqual(toValue: loginRegisterTextField.text).observeSingleEvent(of: .value, with: { (snapshot: DataSnapshot) in
   if snapshot.exists() {
       print("Login exists") 
   } else {
       print("Login does not exist")
  }
})

JSON 是:

规则适用于节点users

{
  "rules": {
        
    "users" : { 
      ".read": "auth != null",

          "$uid" : {
            ".write": "auth != null && auth.uid == $uid",
        }
    },

如果没有新的uid,是否可以编写规则来检查username 的存在?

【问题讨论】:

  • 您使用的username 子节点与UID 无关,实际上也与规则无关。这个代码流的问题是,为了检查用户名是否存在,用户必须经过身份验证,但如果这是一个新用户,他们还没有经过身份验证,所以这是行不通的。一种选择是首先创建 firebase 帐户(对用户进行身份验证)然后要求他们创建用户名。在这种情况下,您的代码将按原样工作。否则,您可以保留可公开访问的用户名列表,或利用云功能。
  • @Jay 谢谢,我也想用用户名创建一个新的可读分支,但我希望直到最后不要这样做)

标签: swift firebase firebase-realtime-database firebase-security


【解决方案1】:

无法检查安全规则中 JSON 分支中的特定 。之前已经讨论过很多次了,所以我建议您查看其中的一些search results

但您可以让您在/users 上的查询更加安全,只允许特定查询,不允许人们阅读所有/users。对于secure the query,您可以这样做:

{
  "rules": {     
    "users" : { 
      ".read": "auth != null && 
                query.orderByChild == 'username' &&
                query.equalTo !== null",
      ...

这是我第一次使用query.equalTo !== null,所以那部分可能会有一些小错误,但流程应该清晰。

【讨论】:

  • 我认为 OP 想要检查用户名是否存在 在创建 Firebase 用户之前(他们提到没有 uid),如果是这种情况,用户将不会是 auth还没有。我可能读错了这个问题。
  • 啊,杰伊说得好。在这种情况下,他们可以从/users 上的.read 规则中删除auth != null 部分,并且仍然只允许他们编码使用的特定查询。
  • @Jay 你是对的,我想在创建 Firebase 用户之前检查用户名是否存在
  • @FrankvanPuffelen 感谢您对我的问题的另一种看法。
  • @StanislavPutilov 正如我在上面的评论中所说,如果您从我共享的规则中删除 auth != null && ,即使未经身份验证的用户也可以执行用户名查询 - 但那就是他们所能做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-30
  • 1970-01-01
  • 2016-10-19
  • 1970-01-01
  • 2021-08-16
  • 2019-12-17
相关资源
最近更新 更多