如何确保用户名(由用户通过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"
因此,如果其他人打开我的应用并且必须选择用户名,我该怎样才能防止"他选择已被其他人使用的用户名?
干杯!
答案 0 :(得分:5)
您可以在/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"
}
}
}
}