【问题标题】: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; 但是,现在我收到了这个警告

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

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

【问题讨论】:

    标签: android firebase google-cloud-firestore firebase-security


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 1970-01-01
      • 1970-01-01
      • 2018-07-12
      • 1970-01-01
      • 1970-01-01
      • 2023-01-28
      • 1970-01-01
      • 2020-06-14
      相关资源
      最近更新 更多