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

标签 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"

那么,如果其他人打开我的应用程序并必须选择用户名,我如何“阻止”他选择已被其他人使用的用户名?

干杯!

最佳答案

您可以在位置 /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"
            }
        }
    }
}

关于android - Firebase:检查用户名是否已存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39602797/

相关文章:

swift - 如何使用 typescript 将快照值转换为字典值?

android - Firebase 磁盘持久性错误 : Modifications to Config objects must occur before they are in use

android - 如何使用 drawable 兼容所有屏幕尺寸(idpi、mdpi、hdpi、xhdpi、xxhdpi)

Firebase 函数返回 404

java - DatabaseException : Can't convert object of type java. 要键入的 lang.String

android - Firebase Firestore,获取另一个文档中的引用文档

node.js - 如何使用 Firebase 管理 sdk 更新 Firestore 中的用户列表?

android - 在 android 中 2 天后使 UIL 缓存图像过期

android - 通过Flutter中的APK安装应用程序时如何查看调试控制台?

Android:如何将 WSDL 文件转换为 Android 不稳定的文件