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

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)

因此,如果其他人打开我的应用程序并且必须选择用户名,我怎么能"阻止"他选择已被其他人选择的用户名?

干杯!

Cal*_*lam 5

您可以在/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)

  • 那个".validate":"auth.uid == newData.val()&&!data.exists()"`在最后一条规则中确实是解决这个问题的关键.它可以防止任何人覆盖现有的"声明"用户名,但允许所有者仍然删除它. (4认同)