Firebase 安全规则不起作用 - 无法找出原因


有人知道firestore的安全规则是如何工作的吗?

我正试图做这样的事情,但它不起作用(我无法访问数据(。

match /contents/{contentID} {
allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)/reserved/permissions).data.contents.hasAny([contentID])
allow create, update, delete : if false
}

似乎问题是contentID,因为如果我做这个

match /contents/{contentID} {
allow read: if get(/databases/$(database)/documents/users/$(request.auth.uid)/reserved/permissions).data.contents.hasAny(["3"])
allow create, update, delete : if false
}

并更新位于"用户/保留/权限添加"中的文档;3〃;对于内容(即文档的数组字段(,它是有效的。这就像contentID没有正确转换一样。

有人能解释一下原因吗?

更新

客户端代码只是

firestore()
.collection('contents')
.onSnapshot((querySnapshot) => {
console.log(querySnapsho)
})

并且它总是返回null。如果我更改中的规则

match /contents/{contentID} {
allow read: true
allow create, update, delete : if false
}

它是有效的。所以问题出在规则上

问题是安全规则不是过滤器。我强烈建议您阅读该文档以了解系统是如何工作的。

您的查询尝试获取集合中的所有文档。规则拒绝该查询,因为不确定客户端是否真的对每个文档都有读取权限。它将而不是为每个可能的文档评估get()——这根本无法扩展(对于大型集合来说,这将非常昂贵(。

您的客户端应用程序应该能够get()规则评估为true的任何单个文档,但您将无法对集合执行这样的查询。

这个规则写得很好。问题是对整个集合的泛型查询get(("内容";这种规则被激活后是不允许的(这是有道理的,因为这种行为是为了减少查询所需的资源(

阅读本文以理解的逻辑

https://medium.com/firebase-developers/what-does-it-mean-that-firestore-security-rules-are-not-filters-68ec14f3d003

最新更新