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

Posted

技术标签:

【中文标题】为啥 firebase_firestore 安全规则不适用于文档读取【英文标题】:Why firebase_firestore security rules not worked for document read为什么 firebase_firestore 安全规则不适用于文档读取 【发布时间】:2021-03-31 17:56:44 【问题描述】:

我目前正在开发一个应用程序,并且该用户需要创建一个新帐户。您输入名字和姓氏,然后应用程序会自动建议一个唯一的用户名,它将是该用户的文档名称。我已将 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 安全规则设置为以下条件的情况下,用户如何能够阅读文档以检查是否存在类似的文档名称?

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

【问题讨论】:

用户需要先登录才能阅读该集合。如果这是您的用例的问题,请考虑不要求他们登录。 【参考方案1】:

首先,我不会使用用户名将您的数据存储在 Firestore 中,而是使用通过 google auth 进行身份验证时提供的 uid。这将允许您使用以下安全规则更安全地访问数据库: rules_version = '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;

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

【讨论】:

以上是关于为啥 firebase_firestore 安全规则不适用于文档读取的主要内容,如果未能解决你的问题,请参考以下文章

ATFX安全知识:被骗维权需准确,规避难追回亏损

安规耐压与漏电流

Altium designer 09 看图不同网络交互式布线为啥可以连接?

"UL"是何组织

欧盟led灯具安规标准要求是什么?

数据分析行业规制和发展国际研讨会召开