Firebase:检查用户名是否已存在
如何确保用户名(由用户通过EditText
字段选择)是唯一的?我目前使用的实时数据库:Firebase:检查用户名是否已存在
FirebaseAuth auth = FirebaseAuth.getInstance();
FirebaseUser user = auth.getCurrentUser();
mDatabase = FirebaseDatabase.getInstance();
User mUser = new User(user.getUid().toString(), username);
DatabaseReference allUsersRef = mDatabase.getReference("AllUsers");
allUsersRef.child(user.getUid().toString()).setValue(mUser);
(username
=用户名由用户选择的; User
=对象,其只包含UID和用户名)
这将产生以下结构:
MyApp
|
---AllUsers
|
---THE_USERS_UID
|
|---username: "THE_USERS_USERNAME"
|
|---uid: "THE_USERS_UID"
因此,如果有人打开我的应用程序,并且必须选择一个用户名,我该如何“阻止”他选择其他人已经选择的用户名?
干杯!
您可以在/usernames
位置创建另一个分支,该分支包含带有已获取用户名的密钥的子级,以及声明该用户的$uid
父级的子级。
{
"users": {
"$uid": {
"username": {
"callam": true
}
}
},
"usernames": {
"callam": {
"$uid": true
}
}
}
现在,您可以创建在users/$uid/username/$username
一个验证规则,只允许如果$username
一直深受用户的$uid
在/usernames/$username/$uid
声称写。
"users": {
"$uid": {
"username": {
...,
"$username": {
".validate": "root.child('usernames/' + $username).hasChild($uid)"
}
}
}
}
你可以再拍规则,只允许你在要求一个/usernames/$username
用户名如果没有已经处于该位置的值。
"usernames": {
...,
"$username": {
"$uid": {
".validate": "auth.uid == $uid && !data.exists()"
}
}
}
或者
数据库
{
"usernames": {
"callam": "$uid"
},
"users": {
"$uid": {
"username": "callam"
}
}
}
规则
{
"usernames": {
"$username": {
".validate": "auth.uid == newData.val() && !data.exists()"
}
},
"users": {
"$uid": {
"username": {
".validate": "auth.uid == $uid && root.child('usernames/'+newData.val()).val() == $uid"
}
}
}
}
“'.validate”:“auth.uid == newData.val()&&!data.exists()”'在上一条规则真的是解决这个问题的关键。它可以防止任何人覆盖现有的“声明”用户名,但允许所有者仍然删除它。 –
http://stackoverflow.com/questions/43752247/how-to-check-already-existed-email-in-firebase-database – chris
你可以使用dataSnapshot.exists()或dataSnapshot.hasChild()M编制方法。 – uguboz
卡拉姆的回答有重要的部分,这就是你需要用规则来保证这一点。另请参阅[这个经典答案](http://stackoverflow.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase)和可能很多[这些](http:///stackoverflow.com/search?q=%5Bfirebase%5D+unique+username) –