代码之家  ›  专栏  ›  技术社区  ›  Dan Macak

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

  •  2
  • Dan Macak  · 技术社区  · 6 年前

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

    这就是集合的样子-只有一个文档 useruid 领域

    enter image description here

    字段的值映射到用户 uid (截图拍摄于 身份验证->用户 选项卡。

    enter image description here

    规则是这样的

    enter image description here

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

    如果我修改规则条件以始终返回 true 或者如果我只检查 要求授权。uid 我得到了正确的查询结果。有趣的是 resource.data 涉及-例如,检查 amount firebase规则中的字段-从未满足该条件。我试着这样写

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

    然后又出现了错误。看来我不明白 资源数据 根本不需要地图。

    我觉得我错过了一些明显的东西,尽管在阅读了指南之后,我觉得这一切都很好,我已经没有想法了。调试功能(或缺乏)使整个过程非常缓慢。

    你能给我解释一下为什么我没拿到 资源数据 映射firebase安全规则,或将我指向可能存在问题的地方?

    1 回复  |  直到 6 年前
        1
  •  3
  •   Renaud Tarnec    6 年前

    您很可能错过了文档中的一个特定点:您的查询失败“因为它没有包含与您的安全规则相同的约束”。看见 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 子句,您将得到您正得到的确切错误