无法将安全规则条件基于 Firebase 中的资源数据

Unable to base security rule condition on resource data in Firebase

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

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

该字段的值映射到用户 uid(屏幕截图取自 身份验证 -> 用户 选项卡。

规则看起来像这样

我应该取回一个文档,但每次我在该用户登录的情况下查询文档(我使用 angularfire2 用于这些目的)我得到 Error: Missing or insufficient permissions.

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

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

又报错了。好像我根本没有得到 resource.data 地图。

我觉得我遗漏了一些明显的东西,虽然在阅读了指南之后,我觉得还好,我已经没有想法了。调试能力(或缺乏)使整个过程非常缓慢。

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

您很可能错过了文档中的一个特定点:您的查询失败 "because it does not include the same constraints as your security rules"。参见 https://firebase.google.com/docs/firestore/security/rules-query#secure_and_query_documents_based_on_authuid

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

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());
            });
        });

    });

如果您删除 where 子句,您将得到与您收到的完全相同的错误