因此,在我目前的iOS应用程序中,我正在使用firebase,我目前正在努力使其成为所有用户在注册阶段拥有唯一的用户名。我有这个功能似乎可以检查用户名是否存在。
//will ensure that a user has a unique username
static func checkUserNameAlreadyExist(newUserName: String, completion: @escaping(Bool) -> Void) {
let ref = Database.database().reference()
ref.child("users").queryOrdered(byChild: "username").queryEqual(toValue: newUserName)
.observeSingleEvent(of: .value, with: {(snapshot: DataSnapshot) in
if snapshot.exists() {
completion(true)
}
else {
completion(false)
}
})
}
但是,当我尝试在注册屏幕中创建用户时运行此功能。它没有这样做并且给出了这个错误
Listener at /users failed: permission_denied
我得出的结论是,它与我目前默认的规则有关。
{
"rules": {
".read": "auth != null",
".write": "auth != null",
".indexOn": "g"
}
}
所以我的问题是......无论如何,我可以更改我的规则以使用此功能,因为我不想在检查用户名是否唯一之前验证用户。如果采用了许多用户名,这可能会使成千上万的人加入到auth中。非常感谢任何帮助
答案 0 :(得分:0)
这里有很多潜在的解决方案。这里有一些我的头脑:
JOIN
文件。如果没有任何敏感信息,那么允许这样做可能是有意义的,尽管你可能正确地要求用户至少经过身份验证。此解决方案如下所示:
users
{
"rules": {
"users": {
".read": true,
".write": "auth != null"
}
}
}
文档中查询有效的用户名。此处不需要示例代码,就像您在调用函数中的函数之前等待用户进行身份验证一样,该函数将在此时运行。然后,您只需要在users
文档中更新该用户的username
密钥。
要执行此操作,您必须创建一个新文档(让我们称之为users
),每次用户成功进行身份验证时,都要将它们添加到usernames
文档中,然后添加它们user
文档的用户名。然后,您可以在我的第一个示例中设置username
的权限:
usernames