【问题标题】:Firestore security rules get function errorFirestore 安全规则获取功能错误
【发布时间】:2020-01-14 10:37:27
【问题描述】:

当用户注册时,应用程序会使用为 Firebase 身份验证生成的相同 uid 将用户保存在 Firestore 中。现在我正在尝试为单独的集合(不是用户集合)编写一个安全规则,其中 readwrite 操作仅在请求者具有 isAdmin 字段设置为 true。正如您在图像上看到的那样,即使 get() 函数中的路径正确,我也得到了一个不存在的错误。什么可能导致此错误?

我尝试了许多路径变体,更改集合,小写所有内容等。我在 Google 中找不到任何关于此的内容,官方文档显示的用法与我使用它的方式相同。

安全规则:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /user/{user} {
      allow read,write: if true
    }
    match /akarmi/{akarmiId} {
      allow read, write:
      if get(/databases/$(database)/documents/user/$(request.auth.uid)).data.isAdmin == true
    }
  }
}

我希望这段代码能够运行并允许或禁止访问,并且不会抛出不存在的错误。

【问题讨论】:

  • 您是否尝试将您的request.auth.uid 放入[ ]?像这样:if get(/databases/$(database)/documents/user/$([request.auth.uid])).data.isAdmin == true
  • 刚刚尝试过,我认为它不是一个已知的语法....运行模拟时出错 — 错误:simulator.rules 行 [11],列 [8]。找不到函数错误:名称:[get]。;错误:提供给调用的参数无效。函数:[get],参数:["||invalid_argument||"]
  • 也可能是因为您使用的是模拟器而发生的?您是否尝试从您的客户端向 Firestore 发送请求?
  • 我不得不为此编写一些实际代码,但它仍然无法正常工作。我尝试使用允许读取:如果为真并且我编写的代码正在运行,我会获取数据,但获取功能仍然不好。我不知道为什么。
  • 请编辑问题以显示与这些规则不符合您期望的数据库查询代码。如果不知道规则允许或拒绝的请求,规则就没有意义。

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


【解决方案1】:

我通过以下配置解决了我的问题:

您必须设置一个真实的 Firebase UID 才能使用模拟器,实际的 UID 解决了问题,错误消息非常具有误导性。

【讨论】:

    【解决方案2】:

    上面 Yoann 的回答帮助了我。

    我必须向模拟器提供用户名。这允许使用 get() 和 exists() 函数进行测试,并检查数据库条目中的用户角色。

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 2019-11-09
      • 1970-01-01
      • 2019-12-27
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      • 2018-04-14
      • 2020-07-07
      相关资源
      最近更新 更多