Firebase Android:使用户名唯一

Firebase Android:使用户名唯一

解析将在年底关闭,所以我决定开始使用Firebase。我需要实现一个注册过程的三个字段:电子邮件,用户名,密码(电子邮件和用户名对我的应用程序来说一定是独一无二的)。

由于Firebase并不提供像Parse这样的管理用户名的简单方法,所以我决定只使用电子邮件/密码注册,并保存一些额外的数据,比如用户名。以下是我的用户数据结构:

app : {
    users: {
       "some-user-uid": {
            email: "test@test.com"
            username: "myname"
       }
    }}

但是,我想做的是使用户名唯一,并在创建帐户之前检查它。以下是我的规则:

{
    "rules": {
        ".read": true,
        ".write": true,
        "users": {
            "$uid": {
                ".write": "auth !== null && auth.uid === $uid",
                ".read": "auth !== null && auth.provider === 'password'",
                "username": {".validate": "!root.child('users').child(newData.child('username').val()).exists()"}
            }
        }
   }}

非常感谢你的帮助


30秒到达战场
浏览 504回答 3
3回答

拉丁的传说

部分答案是存储用户名索引,您可以在安全规则中对照这些索引进行检查:app : {     users: {        "some-user-uid": {             email: "test@test.com"             username: "myname"        }     },     usernames: {         "myname": "some-user-uid"     }}所以usernames节点将用户名映射到uid。它本质上是“用户名‘myname’是‘一些用户-uid’所拥有的‘。”使用此数据结构,您的安全规则可以检查给定用户名是否已经有条目:"users": {   "$uid": {     ".write": "auth !== null && auth.uid === $uid",     ".read": "auth !== null && auth.provider === 'password'",     "username": {       ".validate": "         !root.child('usernames').child(newData.val()).exists() ||         root.child('usernames').child(newData.val()).val() == $uid"     }   }}这将验证用户名还没有被任何人声明,或者它是由当前用户声明的。

慕码人8056858

按照Frank的建议保存用户名,但在保存用户名时,请使用Firebase中的runTransaction函数来确保用户名不被占用。此函数由Firebase保证为原子操作,因此您可以放心不发生冲突。firebaseRef.child("usernames").child(username).runTransaction(new Transaction.Handler() {     @Override     public Transaction.Result doTransaction(MutableData mutableData) {         if (mutableData.getValue() == null) {             mutableData.setValue(authData.getUid());             return Transaction.success(mutableData);         }         return Transaction.abort();     }     @Override     public void onComplete(FirebaseError firebaseError, boolean commited, DataSnapshot dataSnapshot) {         if (commited) {             // username saved         } else {             // username exists         }     }});
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Android