【问题标题】:How to enforce values in a map in Firestore rules without knowing the keys?如何在不知道键的情况下在 Firestore 规则中强制执行映射中的值?
【发布时间】:2018-06-11 14:40:37
【问题描述】:

我正在尝试实现类似于"Working with Arrays, Lists, and Sets" example in Firestore's document, 的东西,但用于用户访问控制列表。

在文档中,将有一个时间戳的modified 字段和一个映射的users 字段,其中包含用户的 UID 作为键和修改后的时间戳作为值(以便我可以使用它进行排序字段)。

{
    modified: 2018-01-01T17:05:00Z,
    users: {
        someUID: 2018-01-01T17:05:00Z,
        otherUID: 2018-01-01T17:05:00Z
        /* ... */
    }
}

很明显,我必须使users 映射中的值与modified 字段保持同步。由于我不想在文档更新时支付云函数调用和文档写入,因此我计划在客户端上进行更新,同时更新文档本身。

问题是,我如何使用 Firestore 安全规则强制执行 users 映射的值,以便它始终与修改后的字段同步?这个map的key是事先不知道的,这个map的大小也是可变的。

【问题讨论】:

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


    【解决方案1】:

    如果map 是变量或更新时密钥未知,您可以使用writeFields 更新规则。

    allow update: if request.auth != null
         && request.resource.data.users is map
         && request.writeFields.size() == 1
         && (('users.' + request.auth.uid) in request.writeFields)
         && request.resource.data.users[request.auth.uid] <= request.time.time();
    

    【讨论】:

    • 这不是我想要的。您的示例只能强制执行更新程序的时间戳,而不是其他所有人。我希望它适用于地图中的每个字段。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2011-01-07
    • 2020-01-25
    • 1970-01-01
    • 2019-06-18
    相关资源
    最近更新 更多