为什么 firebase_firestore 安全规则不适用于文档读取

时间:2020-12-22 00:27:15

标签: flutter google-cloud-firestore firebase-authentication firebase-security

我目前正在开发一个应用程序,该用户需要创建一个新帐户。您输入名字和姓氏,然后应用程序会自动建议一个唯一的用户名,它将是该用户的文档名称。我已经设置了 Firestore 安全规则如下,

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if request.auth != null;
    }
  }

在用户输入用户名后,它会在进入下一个屏幕之前检查用户名是否使用过。

  Future<bool> checkUsernameExist(String name)async{
    bool usernameExistSate;
    await firestore.collection('users').doc(name).get().then((docSnapShot){
      if(docSnapShot.exists){
        usernameExistSate = true;
      }else{
        usernameExistSate = false;
      }
    });
    return usernameExistSate;
  }

目前上述系统工作正常,没有任何问题。但是我有一个问题,在将 firebase 安全规则设置为以下条件的情况下,用户如何能够阅读文档以检查是否存在类似的文档名称?

<块引用>

允许读、写:if request.auth != null;

1 个答案:

答案 0 :(得分:1)

首先,我不会使用用户名将您的数据存储在 firestore 中,而是使用您通过 google auth 进行身份验证时提供的 uid。这将允许您使用如下安全规则更安全地访问数据库: 规则版本 = '2';

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId}/{document=**} {
      allow read, write, update, delete: if request.auth != null && request.auth.uid == userId;
      allow create: if request.auth != null;
    }
  }
}

对于您的第二个问题,我将在名为 usernames 的 firebase 项目的根目录中创建第二个集合,其中所有用户名都存储在一个大列表中,以便您可以通过 firebase API 安全地查询它们。为此,您必须让经过身份验证的设备访问此集合,例如在

下添加此内容 <块引用>

匹配 /users/...

match /usernames/{document=**} {
      allow read, write, update, delete, create: if request.auth != null;
}

当然,您必须在进行更改时跟踪这两个列表。但是这样一来,经过身份验证的用户在最坏的情况下只能访问他的数据和所有用户名。