Firebase:检查用户名是否已存在

时间:2016-09-20 19:58:54

标签: 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);

username =用户选择的用户名; User =仅包含UID和用户名的对象)

这会产生以下结构:

MyApp
 |
 ---AllUsers
     |
     ---THE_USERS_UID
          |
          |---username: "THE_USERS_USERNAME"
          |
          |---uid: "THE_USERS_UID"

因此,如果其他人打开我的应用并且必须选择用户名,我该怎样才能防止"他选择已被其他人使用的用户名?

干杯!

1 个答案:

答案 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"
            }
        }
    }
}