安卓 | Firestore 规则 |检查用户名和电话是不是已经存在

Posted

技术标签:

【中文标题】安卓 | Firestore 规则 |检查用户名和电话是不是已经存在【英文标题】:Android | Firestore Rules | Check if username & phone already exists安卓 | Firestore 规则 |检查用户名和电话是否已经存在 【发布时间】:2021-10-27 21:18:16 【问题描述】:

我想检查用户的用户名和电话号码是否唯一。我已经使用 FirebaseFirestore.getInstance().collection("Users").whereEqualTo("phone",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 方法之前检查这个,因此 request.auth.uid 将始终为空。要使代码正常工作,必须保留allow read: true; 但是,现在我收到了这个警告

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

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

【问题讨论】:

【参考方案1】:

这是开发人员在使用usernames 时常犯的错误。您授予任何人读取整个数据库的权限。即使您设法将其设置为仅读取Users,任何人都可以读取您的所有用户数据。

我建议删除第一个 allow read:true 并为每个路径编写应有的规则。还为用户名创建一个单独的collection,并将它们全部保存在那里,如/usernames/$username/phones/$phone。如果需要一起保存可以这样做。

这样,您无需任何查询即可轻松检查 usernamephone 是否存在,只需检查该路径是否存在于您的数据库中。

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

【讨论】:

以上是关于安卓 | Firestore 规则 |检查用户名和电话是不是已经存在的主要内容,如果未能解决你的问题,请参考以下文章

使用 exists() 的 Cloud Firestore 规则是不是算作读取?

在 Firestore 安全规则中的对象列表中过滤/某些

Firestore 安全规则 - 如何检查某个字段是不是被修改?

Firebase 存储规则在 Firestore 文档上查找数据? [复制]

如何检查传入号码数据是否大于或小于Firestore安全规则中的特定限制?

Firestore 安全规则:如果时间戳 (FieldValue.serverTimestamp) 等于现在