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" 

因此,如果有人打开我的应用程序,并且必须选择一个用户名,我该如何“阻止”他选择其他人已经选择的用户名?

干杯!

+0

你可以使用dataSnapshot.exists()或dataSnapshot.hasChild()M编制方法。 – uguboz

+0

卡拉姆的回答有重要的部分,这就是你需要用规则来保证这一点。另请参阅[这个经典答案](http://*.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase)和可能很多[这些](http:///*.com/search?q=%5Bfirebase%5D+unique+username) –

您可以在/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" 
      } 
     } 
    } 
} 
+4

“'.validate”:“auth.uid == newData.val()&&!data.exists()”'在上一条规则真的是解决这个问题的关键。它可以防止任何人覆盖现有的“声明”用户名,但允许所有者仍然删除它。 –

+0

http://*.com/questions/43752247/how-to-check-already-existed-email-in-firebase-database – chris