使用Firebase数据库防止重复用户,Swift 3

时间:2016-12-12 22:16:20

标签: ios swift firebase swift3 firebase-realtime-database

我尝试阻止创建已存在的用户名。

这是我将用户名上传到数据库的代码:

ref?.child("users").child(FIRAuth.auth()!.currentUser!.uid).child("username").setValue(self.createUserName.text)

如果用户名已经存在,这就是我尝试获取的代码

ref?.child("users")
    .queryOrdered(byChild: "username")
    .queryEqual(toValue: self.createUserName.text?.uppercased())
    .observeSingleEvent(of: .value, with: { (snapshot) in

        if !snapshot.exists() {

            print("")

        }

    }) { error in

        print("")

    }

数据库看起来像这样

Database_App {

    users {

        -3bSRmS4PHXUwsr7XbMBwgPozNfK2 {

            username: "sebas.varela"

        }

    }     

} 

并在控制台中显示此行:

Consider adding ".indexOn": "username" at /users to your security rules for better performance

问题是我总是得到。这有什么问题?

1 个答案:

答案 0 :(得分:2)

您只能查询直接位于您查询的引用下的值。对于您的情况,例如:

Database_App {
    users {
        -3bSRmS4PHXUwsr7XbMBwgPozNfK2: "sebas.varela"
    }     
} 

这将在您的代码中起作用,但很难获得安全性和高性能。更常见的方法是使用额外的节点,将用户名映射到uid:

Database_App {
    userNames {
        "sebas,varela": "-3bSRmS4PHXUwsr7XbMBwgPozNfK2"
    }     
} 

在这种情况下,节点基本上允许用户声明他们的名字。该系统的优点是密钥自动保证在服务器上是唯一的,不需要该部分的客户端代码。

您需要:

  • 添加安全规则,确保用户只能声明尚未声明的用户名
  • 在这些安全规则中也允许用户在用户名
  • 上发布其声明
  • 添加客户端代码以更好的方式处理冲突,而不是从服务器获取的默认“权限被拒绝”错误