实时数据库-如何更改安全规则以检查用户名是否存在

时间:2019-08-01 00:25:37

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

我正在尝试检查数据库中是否已经存在用户名。

这是我为此编写的代码。


 func textFieldDidEndEditing(_ textField: UITextField) {

        //check if username is already taken in the database
        let username = self.usernameTextField.text!
        let reference = Database.database().reference().child("activeUsernames")
        let query = reference.queryOrdered(byChild: "username").queryEqual(toValue: username)

        let banner = StatusBarNotificationBanner(title: " The username \(username) is not available.", style: .danger)

        let successBanner =  StatusBarNotificationBanner(title: "The username \(username) is available.", style: .success)

        query.observe(.value, with: { (DataSnapshot) in

            if DataSnapshot.exists() {

                print("Darn username already exists")
                banner.show()

            } else {
               print("Yes I can use this username")
                successBanner.show()



            }

        }, withCancel: nil)
    }

到目前为止,它的工作方式不一致。有时,如果我输入一个已经存在的用户名,则打印语句"Yes I can use this username"显然已经被使用时会出现,有时它会告诉我它已经被使用。我注意到我在控制台中得到了这个声明

  

使用未指定的索引。您的数据将在客户端上下载并过滤。考虑将/ activeUsernames处的“ .indexOn”:“用户名”添加到安全规则中,以提高性能

我不确定这是否导致检查不一致。但是,我不确定如何有效地更改或编辑安全规则。

如果有帮助,这是我用于活动用户名的数据结构,仅显示用户uid和与该uid相关的用户名。

- activeUsernames
 6GpUz3iLwmWdDrlMtf7tT0yAULw2
 username: 
 8sRfoqa4dKYzUKGdIZAtwE6NQZH2
 username: 
 SRY4xUmRMgXbLL7GfsxosF6sS1y2
 username: 

这也是安全规则

 "rules": {
    ".read": true,
    ".write": true
  }
}

2 个答案:

答案 0 :(得分:2)

要摆脱此消息,请将您的规则更改为:

{
  "rules": {
    ".read": true,
    ".write": true
    "activeUsernames": {
      ".indexOn": "username"
    }
  } 
}

这告诉Firebase服务器在username下的/activeUsernames上添加索引,从而使其能够在服务器上而不是在客户端上执行排序/过滤。

答案 1 :(得分:1)

最好的方法是创建一个云函数,该函数将检查用户名是否已使用,并仅返回true或false。

  • 将您的规则设置为true意味着任何人都可以在该数据库中进行读取或写入,这非常不安全
  • 使用允许从您的代码中抽象出来的云功能,并在其他任何平台(例如android和web)中使用
  • 查看云功能文​​档here中有关如何设置和调用云功能的信息,然后可以使用函数中的 Admin SDK 以获得对数据库的完全访问权限并查询数据库。数据库等。
相关问题