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 相同,则允许读取的主要内容,如果未能解决你的问题,请参考以下文章