我希望在用户输入的signUp表单中防止重复的用户名。我创建了如下所示的电子邮件登录,firtly createUser,然后用用户字典验证它的setValue。
但我使用Firebase安全设置进行堆叠以及如何检查处理这种情况。
REF_BASE.createUser(email, password: pwd, withValueCompletionBlock: { ..
REF_BASE.authUser(email, password: pwd, withCompletionBlock: { ..
REF_USERS.childByAppendingPath(uid).setValue(user)
此处理总是响应错误。
REF_USERS.childByAppendingPath(uid).childByAppendingPath("username").setValue(user["username"]) { (error: NSError!, result: Firebase!) in
if error != nil {
print(error.localizedDescription)
}
else {
self.REF_USERS.childByAppendingPath(uid).setValue(user)
}
}
这是我的安全规则,如何修复重复用户阻止的所有内容?
"users": {
".read": "auth !== null",
"$user": {
"username": {
".read": "auth !== null",
".write": "newData.val() === auth.uid && !data.exists()"
}
}
},
更新
来自Frank的答案,但我不知道在这种情况下为swift注册新用户时我需要做什么。
app : {
users: {
"some-user-uid": {
email: "test@test.com"
username: "myname"
}
},
usernames: {
"myname": "some-user-uid"
}
}
我是否需要为两个不同的节点同时添加相同的用户uid?如果有人在Swift中解释它。这会很棒。
"users": {
"$uid": {
".write": "auth !== null && auth.uid === $uid",
".read": "auth !== null && auth.provider === 'password'",
"username": {
".validate": "
!root.child('usernames').child(newData.val()).exists() ||
root.child('usernames').child(newData.val()).val() == $uid"
}
}
}
我无法向用户名父节点添加新用户信息。它需要另一个安全规则吗?
答案 0 :(得分:0)
如果您尝试阻止重复的 Firebase 用户名,可以直接在createUser阶段完成。
假设向新用户提出了一个对话框,要求创建一个帐户:这将获得他们想要的用户名和密码。
将其发送到createUser并且如果出现错误(因为它已经存在),请通知他们并要求使用其他用户名:
myRootRef.createUser(email, password: pw, withValueCompletionBlock: { error, result in
if error != nil {
self.errMsgField.stringValue = "email/username in use, try again"
} else {
let uid = result["uid"] as! String //the uid of the new user
print("user created as \(uid)")
self.authUserWithAuthData( email, password: pw ) //auth the user
}
})
创建用户后,您可能也会将其信息添加到/ users节点。