【问题标题】:Firestore Security Rule limit field entryFirestore 安全规则限制字段条目
【发布时间】:2020-07-24 16:04:14
【问题描述】:

在我的 Firestore 文档中,我试图将用户可以更新的字段限制为我允许的字段。我想到了一个函数,它可以检查request.resource.keys() 是否包含我允许的任何键,如果是,我阻止update,如果不是,我允许update。到目前为止,我的函数如下所示:

function field_limit() {
      let allow_keys = ["field1", "field2", "field3"];
      return request.resource.keys() in allow_keys;
    }

在路径匹配内:

allow update: if field_limit();

当我在修改“field1”的模拟器中运行单元测试时,它没有通过。我认为我在这里做错了,因为我将整个keys 列表与allow_keys 列表进行比较。 那我应该怎么做才能实现所需的功能呢?

我想了一个解决方案来遍历request.resource.keys(),看看每个键是否是in allow_keys。如果不是,请阻止update。但是如何遍历列表的每个值呢?

编辑。应该是 request.resource.data.keys() 而不是 request.resource.keys()。否则,它将不起作用。

【问题讨论】:

    标签: firebase google-cloud-firestore firebase-security


    【解决方案1】:

    in 运算符无法按您预期的方式工作。参见documentation ——它只检查 single 值是否在列表中。

    如果您想检查一个值列表是否仅包含另一个列表中的值的子集,则应改用hasOnly

    request.resource.keys().hasOnly(allow_keys)
    

    如果列表 request.resource.keys() 仅包含来自 allow_keys 列表的值,这将评估为 true。

    【讨论】:

    • 将函数从 return request.resource.keys() in allow_keys; 修改为 return request.resource.keys().hasOnly(allow_keys); 但在修改“field1”的同一测试中仍然失败
    • 我发现了我的问题,应该是“request.resource.data.keys()”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-21
    • 2020-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多