Firebase Firestore 安全规则 |如果字段值与 auth uid 相同,则允许读取

Posted

技术标签:

【中文标题】Firebase Firestore 安全规则 |如果字段值与 auth uid 相同,则允许读取【英文标题】:Firebase Firestore Securitty Rule | Allow read if field value same as auth uid 【发布时间】:2021-09-08 02:34:37 【问题描述】:

我想从

中读取所有文档

使用这个查询

QuerySnapshot data = await firestore
          .collection('Order')
          .where('uId', isEqualTo: auth.currentUser!.uid)
          .limit(20)
          .get();

并且还想应用安全性读取仅请求的身份验证 uid 与 uId/sellerUId 相同。

我已经尝试使用此安全规则

    match /Order/uniqueCode 
        allow read: if get(/databases/$(database)/documents/Order/$(uniqueCode)).data.sellerUId == request.auth.uid ||
                    get(/databases/$(database)/documents/Order/$(uniqueCode)).data.uId == request.auth.uid;
      allow write, update, delete: if true;
    

【问题讨论】:

【参考方案1】:

如果要比较的字段已经在文档中,则无需指定完整路径。

match /Order/uniqueCode 
      allow read: if resource.data.sellerUId == request.auth.uid || resource.data.uId == request.auth.uid;
      allow write, update, delete: if true;

您可以阅读有关数据验证的更多信息here

【讨论】:

【参考方案2】:

我不确定这是否会导致您的问题,但您可能不想get() 与您正在保护的同一个文档。相反,您可以使用resource 来引用它:

match /Order/uniqueCode 
    allow read: if resource.data.sellerUId == request.auth.uid ||
                   resource.data.uId == request.auth.uid;
    allow write, update, delete: if true;

【讨论】:

以上是关于Firebase Firestore 安全规则 |如果字段值与 auth uid 相同,则允许读取的主要内容,如果未能解决你的问题,请参考以下文章

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

在不使用 Firebase 身份验证的情况下设置 Firestore 安全规则

Firebase Firestore 安全规则共享数据

Cloud Firestore 安全规则只允许从 Firebase 函数写入

基于引用数据类型的 Firebase Firestore 安全规则

在 Angular 11 网站上使用 Firestore 和 Firebase 存储进行图像上传功能导致来自 Firebase 的不安全规则通知