【问题标题】:How to use Array for validation in Firestore Rules如何在 Firestore 规则中使用数组进行验证
【发布时间】:2019-08-22 19:15:01
【问题描述】:

在 Firestore 中,我有一个存储多个对象的集合,这些对象由多个用户共享。 示例:

{
  users: [uid1, uid2, uid3],
  content: 'sample'
}

这三个用户都应该能够看到该文档。为此,我创建了以下规则:

service cloud.firestore {
  match /databases/{database}/documents {

    match /sharedDocs/{doc} {
      allow read: if isMember(doc);
      allow update: if isMember(doc);
    }

    function isMember(doc) {
      return doc.indexOf(request.auth.uid) != -1;
    }
  }
}

我通过 Angular(AngularFirestore 模块)发送查询:

return this.db.collection('sharedDocs,
  ref => ref.where('users', 'array-contains', uid)
).valueChanges();

很遗憾,我在此查询中收到以下错误:

ERROR FirebaseError: 权限缺失或不足。

【问题讨论】:

  • 规则只会在您对它们运行代码后拒绝操作。您能否编辑您的问题以包含获得该错误消息所需运行的最少代码?
  • 好的。我添加了查询。
  • 嗯...我不知道这在安全规则中是否可行。但我希望@DougStevenson 能出现并确认。
  • 好的。我是这么想的。您对同一用例的不同安全策略有什么想法吗?
  • @FrankvanPuffelen 如果不可能的话。也许我只允许从前端主机名读取。这可能吗?

标签: firebase firebase-realtime-database firebase-security


【解决方案1】:

您可以编写安全规则,在其中使用数组进行验证。您可以使用in 条件来检查数组中是否存在特定值。

考虑一个示例,您需要限制创建具有现有 uniqueId 的新文档,即如果用户已经创建具有相同 uniqueId 的文档,并且其 uniqueId 存在于 createdDocs 的数组中Users 集合中的他/她的用户文档。

service cloud.firestore {
  match /databases/{database}/documents {
    match /Docs/{uniqueId}{
      //Only restricting new docs 
      allow create: if  (! uniqueId in getUserData(request.resource.data.userId).createdDocs); 
    }       

    //Function to get the user information
    function getUserData(userId){
      return get(/databases/$(database)/documents/Users/$(userId)).data;
    }             
  }
}

根据您的具体情况试试这个:

match /sharedDocs/{doc} {
  allow read: if (request.auth.uid in resource.data.users);

}

注意:请确保在您的应用程序中检查相同的内容,因为已知 Firestore 安全规则模拟器存在一些问题。

希望这会有所帮助。

【讨论】:

  • 它不工作。看起来我无法访问文档数据。我也尝试了非常简单的 if content=='simple'
  • @NicoSchuck 您在阅读文档时遇到错误吗?
  • 我已将修改添加到您现有的读取规则中,以便在您尝试访问的文档的 users 数组字段中存在经过身份验证的用户的 uid 时允许读取sharedDocs 集合。请立即检查。
  • 我在阅读时尝试了与您相同的方式。不幸的是,我仍然遇到同样的错误。
  • @NicoSchuck,你在模拟器上试过了吗?
猜你喜欢
  • 2019-02-27
  • 2019-01-22
  • 1970-01-01
  • 2020-01-21
  • 2018-04-02
  • 1970-01-01
  • 2021-11-29
  • 2017-12-01
  • 1970-01-01
相关资源
最近更新 更多