【问题标题】:Firebase security rules continue to ask "Consider adding ".indexOn":" even after adding indexOn即使在添加 indexOn 之后,Firebase 安全规则也会继续询问“考虑添加“.indexOn”:”
【发布时间】:2021-01-02 17:25:05
【问题描述】:

我添加了一个在 firebase 上搜索用户的功能。 代码如下:

    func searchUser(search: String, includeCurrentUser: Bool = true, completion: @escaping ([User]) -> (), withCancel cancel: ((Error) -> ())?) {
        Database.database().reference().child("users").queryOrdered(byChild:  "username").queryStarting(atValue: search , childKey: "username").queryEnding(atValue: search + "\u{f8ff}", childKey: "username").observeSingleEvent(of: .value, with: { (snapshot) in
                guard let dictionaries = snapshot.value as? [String: Any] else {
                completion([])
                return
            }
            var users = [User]()
            dictionaries.forEach({ (key, value) in
                if !includeCurrentUser, key == Auth.auth().currentUser?.uid {
                    completion([])
                    return
                }
                guard let userDictionary = value as? [String: Any] else { return }
                let user = User(uid: key, dictionary: userDictionary)
                users.append(user)
            })
            
            users.sort(by: { (user1, user2) -> Bool in
                return user1.username.compare(user2.username) == .orderedAscending
            })
            completion(users)
            
            
        }){ (err) in
            print("Failed to fetch all users from database:", (err))
            cancel?(err)
        }
    }

当 searchUser 被调用时,我的 Xcode 控制台状态:

[Firebase/Database][I-RDB034028] 使用未指定的索引。您的数据将在客户端下载和过滤。考虑将 /users 处的 ".indexOn": "username" 添加到您的安全规则中以获得更好的性能

这是我的 Firebase 规则:

{
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    ".read": true,
    ".write": true,
    "posts" : {
        ".indexOn": "creationDate"
    },
    "purchaser" : {
        "$postID" : {
         ".indexOn": ".value"
      }
    },
      "users" : {
        "$uid": {
            ".indexOn" : "username"
        }
      }
    }
    }

这是我的数据库结构:

所以 searchUser 函数可以工作,但是 xcode 控制台继续要求 .indexOn 作为用户名。

这里为什么会出错?

【问题讨论】:

  • 请将安全规则的文本复制到问题本身并格式化为代码,而不是显示图片。
  • 抱歉,一切都变了!谢谢。

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


【解决方案1】:

索引需要在您在查询中使用它们的位置定义。所以要用每个子节点的username 属性在/users 上定义一个索引:

  "users" : {
    ".indexOn" : "username"
  }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 2017-09-01
    • 2016-09-29
    • 2015-03-19
    • 2016-06-03
    • 2018-03-27
    • 2016-06-17
    • 1970-01-01
    相关资源
    最近更新 更多