Firebase firestore规则,文档包含特定值时只读

Firebase firestore规则,文档包含特定值时只读,firebase,firebase-security,google-cloud-firestore,Firebase,Firebase Security,Google Cloud Firestore,我是通过官方的安全规则学习的,但我不能让它工作 在我的收藏中,文档user下的users有一些映射值,其中一个是role:“guest”。角色值可以是“来宾”或“超级管理员” 仅当角色==“超级管理员” 这是我试过的 service cloud.firestore { match /databases/{database}/documents { match /users/{userId} { allow read: if get(/databases/$(datab

我是通过官方的安全规则学习的,但我不能让它工作

在我的收藏中,文档
user
下的
users
有一些映射值,其中一个是
role:“guest”
。角色值可以是
“来宾”或“超级管理员”

仅当
角色==“超级管理员”

这是我试过的

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
        allow read: if get(/databases/$(database)/documents/users/$(userId)).data.role == "superAdmin";
    }
  }
}
当我以
superAdmin

错误:缺少权限或权限不足

我相信我是正确的。并且在where中发现了一个类似的问题,即一些特定于计算查询中嵌套字段的bug。但是我没有嵌套查询。我做错什么了吗

这是我的firestore外观


请帮助。

我认为破坏它的部分是
允许读取:if get(/databases/$(database)/documents/users/$(userId))
。这里您比较的是文档的所有者,而不是请求它的所有者。尝试将
userID
替换为
request.auth.uid

我认为破坏它的部分是
allow read:if get(/databases/$(database)/documents/users/$(userID))
。这里您比较的是文档的所有者,而不是请求它的所有者。尝试将
userID
替换为
request.auth.uid

而不是使用
get()
,因为您在读取的位置获取文档,只需使用
resource
(该位置的预取文档)对其进行寻址即可:

如果您要到另一个集合获取数据,请仅使用
get()

而不是使用
get()
,因为您要在读取的位置获取文档,只需使用
资源
(该位置的预取文档)对其进行寻址即可:


如果您要到其他集合获取数据,请仅使用
get()

您说得对。我试了一下,等了10分钟,但不幸的是同样的错误
如果get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role==“superAdmin”
正确吗?你说得对。我试了一下,等了10分钟,但不幸的是同样的错误
如果get(/databases/$(database)/documents/users/$(request.auth.uid)).data.role==“superAdmin”
是否正确?看起来像firestore中的一个bug,它仍处于测试阶段。找到了另一个解决方案。正在等待正确答案。看起来像firestore中的一个bug,它仍处于测试阶段。找到了另一个解决方案。等待正确的答案。
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{userId} {
        allow read: if resource.data.role == "superAdmin";
    }
  }
}