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

Android | Firestore规则|检查用户名

郤仰岳
2023-03-14

我想检查用户的用户名和电话号码是否唯一。我已经用FirebaseFirestore实现了它。getInstance()。集合(“用户”)。whereEqualTo(“电话”,ph)。get()。addOnCompleteListener(…)

这是我的firestore规则:

service cloud.firestore {
  match /databases/{database}/documents {
        match /{document=**} {
        allow read: true;
        allow write: if request.auth.uid != null;
        }
      match /Users/{userID} {
            allow update: if request.auth.uid == userID 
                && (request.resource.data.username == resource.data.username
               || isUserNameAvailable(request.resource.data.username)
            );
        }
  }

代码运行良好,没有问题。我在使用signInWithCredential方法和请求之前检查这个。啊。uid将始终为空。要使代码工作,我必须保持allow read:true

我们检测到您的安全规则存在以下问题:任何用户都可以读取您的整个数据库

有什么办法可以防止这种情况发生吗?


共有1个答案

许博易
2023-03-14

这是开发人员在使用用户名时经常犯的错误。你允许任何人阅读你的整个数据库。即使你成功地将其设置为只读取用户任何人都可以读取你所有的用户数据。

我建议删除第一个allow read:true,并按原样为每个路径编写规则。另外,只为用户名创建一个单独的集合,并将它们全部保存在那里,比如/usernames/${username}/phones/${phone}。如果需要一起保存,你可以这样做。

这样,您可以非常容易地检查,而无需任何查询,如果用户名电话存在,只需检查该路径是否存在于您的数据库中。

您可以非常轻松地将users集合与这两个集合同步,甚至可以编写安全规则,防止在集合中创建具有已存在于usernames集合中的username的用户。

 类似资料:
  • 我正在使用Firebase Cloud Firestore,我想修改我的规则来限制用户查询集合。 这是不允许的:

  • 目前,我正在尝试将与存储在集合中的的id进行匹配: 这是写的还是我做错了什么。任何帮助都很感激。

  • 问题内容: 如何查看表具有的排序规则?IE浏览器,我想看: 问题答案: 显示有关表的信息,包括排序规则。 例如

  • 将true更改为request.auth.uid!=null后,它会出现错误: 我可以弄清楚获取用户数据,比如:电子邮件和密码或用户id令牌,如何使用用户数据解决上述错误?

  • 问题是我不能使用具有这些规则的查询,因为(我发现)无法根据子集合是否包含某个文档进行查询。这意味着我不能列出某个用户所属的所有组。我尝试在作为一部分的映射中列出所有用户,但我无法设置谁可以编辑文档的某些部分的权限,因此这也不起作用。 编辑:据我所知,查询必须以某种方式与规则匹配,否则权限将被拒绝。如何创建一个查询来收集某个用户所在的所有组并满足此规则。