【发布时间】:2020-01-14 10:37:27
【问题描述】:
当用户注册时,应用程序会使用为 Firebase 身份验证生成的相同 uid 将用户保存在 Firestore 中。现在我正在尝试为单独的集合(不是用户集合)编写一个安全规则,其中 read 和 write 操作仅在请求者具有 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