jds*_*erk 2 android firebase firebase-realtime-database
我怎样才能确定用户名(由用户通过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);
Run Code Online (Sandbox Code Playgroud)
(username=用户选择的用户名; User=仅包含UID和用户名的对象)
这产生以下结构:
MyApp
|
---AllUsers
|
---THE_USERS_UID
|
|---username: "THE_USERS_USERNAME"
|
|---uid: "THE_USERS_UID"
Run Code Online (Sandbox Code Playgroud)
因此,如果其他人打开我的应用程序并且必须选择用户名,我怎么能"阻止"他选择已被其他人选择的用户名?
干杯!
您可以在/usernames包含子项的位置创建另一个分支,其中包含已经获取的用户名的键,以及$uid声明它的用户的父项,例如
{
"users": {
"$uid": {
"username": {
"callam": true
}
}
},
"usernames": {
"callam": {
"$uid": true
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在,您可以创建一个验证规则时users/$uid/username/$username,只允许当写$username已经被用户所声称$uid的/usernames/$username/$uid.
"users": {
"$uid": {
"username": {
...,
"$username": {
".validate": "root.child('usernames/' + $username).hasChild($uid)"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并且您可以制定另一个规则,只允许您/usernames/$username在该位置尚未拥有值时声明用户名.
"usernames": {
...,
"$username": {
"$uid": {
".validate": "auth.uid == $uid && !data.exists()"
}
}
}
Run Code Online (Sandbox Code Playgroud)
另外
数据库
{
"usernames": {
"callam": "$uid"
},
"users": {
"$uid": {
"username": "callam"
}
}
}
Run Code Online (Sandbox Code Playgroud)
规则
{
"usernames": {
"$username": {
".validate": "auth.uid == newData.val() && !data.exists()"
}
},
"users": {
"$uid": {
"username": {
".validate": "auth.uid == $uid && root.child('usernames/'+newData.val()).val() == $uid"
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2981 次 |
| 最近记录: |