【问题标题】:Firestore rule to check the value of a dynamic field within a map用于检查地图中动态字段值的 Firestore 规则
【发布时间】:2020-04-28 09:59:35
【问题描述】:

想想一个投票应用程序,它在 Firestore 文档中有一个地图。 该映射将投票键作为字符串,将数字作为值(计数器)。 例如“什么是最好的食物”:

{
...
...
poll : [
    pizza : 10,
    barbecue: 3,
    pasta: 1,
    ...
     ]
...
}

项目可能因投票而异。每位用户只能投一票。只有登录的用户才能投票(Firestore 规则)。 最低金额为零,人们可以从一个切换到另一个(减少时刻)。 此外,增幅应该只有 +1。

事务保护应用程序,以避免任何项目小于 0,并且 +1 被控制在那里。 有没有办法通过 Firestore 规则来保护? 老实说,我不确定是否有必要。

我可以使用地图差异功能获取受影响的项目。但是如何检查特定更改的项目值? map diff结果带来了一个集合,但是我不能使用request.resource.data中的集合检索到的键,否则问题就解决了。 我可以检查它是否为 0,如果差异为 1,也可以检查当前数据。

关键肯定会在地图中,因为它来自地图本身的 diff 函数。

【问题讨论】:

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


    【解决方案1】:

    2021 年 2 月更新:这不适用于最新的 firebase,因为键是一组无法编入索引的集合

    您可以使用

    获取受影响的密钥
    let affectedKeys = request.resource.data.poll.diff(resource.data.poll).affectedKeys();
    

    但是,根据firebase docs on MapDiff,无法获取值的更改,只能获取键。

    如果你知道有多少投票项目,你可以这样做

    let differenceOfOne = request.resource.data.poll[affectedKeys[0]] == resource.data.poll[affectedKeys[0]] + 1 || request.resource.data.poll[affectedKeys[0]] == resource.data.poll[affectedKeys[0]] - 1
    

    并为每个索引重复该行,直到最大项目数(firebase 规则中不允许循环)。

    【讨论】:

    • 这仍然对您有用吗?基于docsaffectedKeys 返回一个rules.Set,它不允许使用整数索引进行访问。我确实尝试对上面的affectedKeys[0] 做同样的事情,但是在编译规则时会引发错误Invalid type. Received one of [set]. Expected one of [string, list, map, path]
    • 我刚试过,看起来你是对的,这不再起作用了:(还没有找到替代解决方案
    • 你可以在这里提交功能请求:firebase.google.com/support/troubleshooter/report/features我已经提交了我的,但是你可以支持这个请求。
    猜你喜欢
    • 1970-01-01
    • 2018-03-22
    • 2021-01-05
    • 1970-01-01
    • 2019-08-14
    • 2020-09-09
    • 2020-11-10
    • 2020-02-13
    • 1970-01-01
    相关资源
    最近更新 更多