如何确保用户名(由用户通过 EditText
字段选择)是唯一的?我目前正在使用实时数据库:
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"
}
}
}
}
关于android - Firebase:检查用户名是否已存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39602797/