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

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

问题描述:

我通过官方doc了解安全规则,但无法使其工作。Firebase Firestore规则,只读文档包含特定值时

在我的收藏users在文档user下有一些地图值,其中之一是role: "guest"。角色值可以"guest" or "superAdmin"

我希望获得/users只有当role == "superAdmin"

这里就是我想

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

,并得到了错误,当我为superAdmin

ERROR Error: Missing or insufficient permissions.

登录我相信我正确地遵循了文档。并在SO中发现了一个类似的问题,其中说明了某些特定于评估查询中嵌套字段的错误。但我没有嵌套查询。我在这里做错了什么?

这里是我公司的FireStore看

enter image description here

请帮助。

+0

看起来像一个在firestore中的错误,它仍处于测试阶段。找到了一个替代解决方案[这里](https://*.com/questions/46629170/firestore-security-rule-get-not-work)。等待正确的答案。 – Hareesh

而不是使用get()的,因为你在你从读取位置读取该文件,只需使用resource(这是在该位置的预读文件)解决这个问题:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /users/{userId} { 
     allow read: if resource.data.role == "superAdmin"; 
    } 
    } 
} 

只有使用get()如果你要去一个不同的集合来获取数据。

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

+0

你说得对。我试了一下,等了10分钟,但不幸的是同样的错误。 '如果得到(/数据库/ $(数据库)/文件/用户/ $(request.auth.uid))。data.role ==“superAdmin”'是否正确? – Hareesh