无法在Firebase中的资源数据上建立安全规则条件

时间:2018-05-05 11:27:41

标签: firebase google-cloud-firestore angularfire2

我正在尝试非常简单的事情,即将request.auth.uid与Firebase安全规则中的事务文档(例如此resource.data.useruid)中的字段值匹配,以便获取特定登录用户的交易。但是,我在查询时没有收到任何文件,而是收到错误。

这就是集合的样子 - 只有一个带有useruid字段的文档。

enter image description here

字段的值映射到用户 uid (在身份验证 - >用户标签中截取的屏幕截图。

enter image description here

规则看起来像这样

enter image description here

我应该返回一个文档,但每次我用登录的用户查询文档时(我使用angularfire2用于那些目的)我得到Error: Missing or insufficient permissions.

如果我修改规则条件以始终返回true,或者如果我只检查request.auth.uid的真实性,我会得到查询结果。有趣的是,涉及resource.data - 例如。检查firebase规则中amount字段的值 - 从不满足条件。我试着把它写成

allow read, write: if resource.data.amount == 3

再次出错。好像我根本没有获得resource.data地图。

我觉得我错过了一些明显的东西,虽然在阅读了指南后,对我来说似乎没问题,我已经没有想法了。调试功能(或缺乏)使整个过程非常缓慢。

您能否向我解释一下,为什么我没有在firebase安全规则中获取resource.data地图或指向可能出现此问题的地方?

1 个答案:

答案 0 :(得分:3)

您很可能错过了文档中的一个特定点:您的查询失败“因为它不包含与您的安全规则相同的约束”。见https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_authuid

以下内容与您的安全规则完美配合:

?InitNetwork@@YAHQAD0H@Z

如果删除firebase.auth().signInWithEmailAndPassword("xxxx@xxxx.com", "xxxxx") .then(function (info) { db.collection("transactions").where("userid", "==", info.uid).get().then(function(querySnapshot) { querySnapshot.forEach(function(doc) { console.log(doc.id, " => ", doc.data()); }); }); }); 子句,则会收到准确的错误