为了账号安全,请及时绑定邮箱和手机立即绑定

Firebase Android:使用户名唯一

Firebase Android:使用户名唯一

30秒到达战场 2019-06-15 13:43:24
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()"}             }         }    }}非常感谢你的帮助
查看完整描述

3 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

部分答案是存储用户名索引,您可以在安全规则中对照这些索引进行检查:

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

这将验证用户名还没有被任何人声明,或者它是由当前用户声明的。


查看完整回答
反对 回复 2019-06-15
?
慕码人8056858

TA贡献1803条经验 获得超6个赞

按照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
        }
    }});


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 503 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信