当前位置: 首页 > 知识库问答 >
问题:

Firebase android:使用户名唯一

陈淳
2023-03-14

Parse将在年底关闭,所以我决定开始使用Firebase。我需要用3个字段实现注册过程:电子邮件、用户名、密码(电子邮件

由于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个答案

程吕恭
2023-03-14

为用户名创建一个新分支,当新用户登录时,获取所有用户名的列表,并检查其是否存在于数据库中,如果存在,则向其显示toast,否则将其用户名放入用户名分支。。

戴浩初
2023-03-14

按照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
        }
    }
});
景元徽
2023-03-14

部分答案是存储用户名索引,您可以在安全规则中检查该索引:

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

因此,用户名节点将用户名映射到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"
    }
  }
}

这将验证用户名是否尚未由任何人声明,或者是否由当前用户声明。

 类似资料:
  • 问题内容: 我最近遵循了有关Thinkster的教程,以使用Angular和Firebase创建Web应用程序。 本教程使用Firebase simpleLogin方法允许创建包含用户名的“配置文件”。 厂: 控制器: 在本教程的最后,有一个“后续步骤”部分,其中包括: 强制用户名唯一性-这很棘手,检查Firebase优先级,看看是否可以使用它们按用户名查询用户个人资料 我进行了搜索,但是找不到关

  • 我有一个注册表格,通过以下步骤: 填写用户信息(姓名,地址等)和用户名 如果用户按下提交按钮,则检查用户名是否已经在数据库中 如果用户名已经在使用,他必须重命名用户名,如果没有,则显示他输入的内容(名称,地址等)。 他必须确认网站规则和他输入的数据是正确的。如果他按下确认按钮,数据库中将插入一行他的详细信息和用户名。 我不想在步骤2之后将行插入数据库中。,因为我不希望数据库中没有确认规则的用户的行

  • 我的应用程序有一个单一的endpoint。它触发OAuth2授权授予流。它只能由匿名用户调用。每个匿名用户代表在资源服务器中具有不同权限的不同人员。需要每个匿名用户的同意(即不同的授权)。 Spring Boot OAuth2中需要每个匿名用户同意的配置是什么? 我正在使用Spring Boot oath2-Client 2.6.4和Spring Security 5.6.2。 目前,我有oaut

  • 我有3个节点的hazelcast服务器集群,每个节点都启动了hazelcast客户端。hazelcast客户端使用智能路由,使用客户端/服务器模式。 我收集通过IExecutorService和ClientService连接到Hazelcast服务器集群的客户端列表。每个Hazelcast客户端中的getConnectedClients()。在获取列表后,我想循环访问客户端的获取列表,并将其与自己

  • 我是新来的蛋糕和构建一个应用程序来学习它。我的用户注册系统有一些问题。到目前为止,这是我在控制器中的注册代码: 在我的模型中,我有这样的方法来散列密码: 这样,用户将使用用户名、电子邮件和哈希密码添加到我的数据库中的my表中。但是,没有进行检查以确保用户名和电子邮件是唯一的。 根据我有限的理解,我需要在我的模型中添加一些验证规则,以确保用户名和电子邮件字段在输入表之前是唯一的?目前,我只有以下验证

  • 标题试图解释该场景: 该客户具有登录功能,允许同名但在不同位置(商店)的用户。 在登录页面,用户通知用户名、密码和所需的存储。 使用Spring Security(使用JPA)我创建了一个UserDetailsService实现,但此接口始终接收一个用户名(并且存储对于与其他用户不同至关重要)。 鉴于这种情况,我有两个问题: > 如何通知spring security有关附加字段的信息?(门店)