【问题标题】:How to match a user's uid stored in document field inside Firebase security rule for Firestore如何匹配存储在 Firebase 安全规则中用于 Firestore 的文档字段中的用户 uid
【发布时间】:2020-03-13 06:09:39
【问题描述】:

我想根据请求数据的用户的 UID 检查存储在文档(名为 premiumID 的父集合)的文档字段中的 UID。简单来说,我希望用户只访问包含其 UID 的文档。

这是我到目前为止所做的事情

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

    match /premiumID/{docId} {

      function userData() {
        return resource.data.uid
      }

      allow update: if userData() == request.auth.uid;
      allow delete: if userData() == request.auth.uid;
      allow create: if request.auth.uid != null;
      allow read: if userData() == request.auth.uid;
    }    
  }
}

这是我的数据库的样子-

这是我测试它的方式。这让我读写被拒绝

【问题讨论】:

  • 请不要在 Stack Overflow 上分享代码链接。将代码复制到问题本身中。
  • 您的规则声明了一个完全为“pID”的集合名称,但您的数据库显然显示了一些不同的东西,这些东西被模糊了。如果没有完全匹配,则无法正常工作。
  • @DougStevenson 我故意模糊了 premiumID 字段,但我想我忘了在另一张图片中这样做。我检查并复制粘贴了路径和集合名称或文档 ID,所以我没有打错。
  • 您可以尝试使用规则simulator,这样我们就可以看到如果您在本地运行会发生什么情况,因为一切似乎都井然有序,您的规则应该可以正常工作。

标签: android firebase google-cloud-firestore firebase-security


【解决方案1】:

规则allow write: if request.auth.uid == request.resource.data.uid; 检查用户身份验证是否与文档包含的字段uid 相同。 但正如您问题的 cmets 中所说,您的收藏名称与您使用的规则不匹配。

查看site,它包含有关 Firebase 规则的非常有用的信息。当我开始使用 firebase 规则来处理更复杂的规则时,它真的帮助了我。

【讨论】:

  • 正如我在 cmets 中添加的那样,我故意将集合名称更改为 pID,但它到处都是 premiumID。就 Fireship 而言,我首先引用它来编写这些规则。我的问题是我找不到从请求中读取文档字段的方法。
【解决方案2】:

我认为如果你想匹配一个文档,你必须使用{document} 而不是{docId}。我也遇到了类似的问题,改成{document}就解决了。

match /pID/{document}

【讨论】:

  • 据我所知,它只是一个通配符变量,你怎么称呼它并不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-26
  • 2020-06-10
  • 1970-01-01
相关资源
最近更新 更多