【问题标题】:Firestore security rules with set {merge}带有集合 {merge} 的 Firestore 安全规则
【发布时间】:2021-01-10 00:32:01
【问题描述】:

在我的 Firestore 数据中,我有以下内容

  • 物品ID
    • amountOfItemsToPurchase: 1
    • itemsLeft: 3

如果用户想要为相同的 ItemID 更新要购买的项目或在 ItemID 不存在的情况下创建文档,我使用set(, {merge:true},但是在Firestore 安全规则的条款变得复杂了。

我写了以下测试:

const initialUserDoc = adminFirestore.collection("Users").doc(VALID_USER_ID).collection("Cart").doc(documentID);
            await initialUserDoc.set({
                "amountOfItemsToPurchase": 1,
                "itemsLeft": 3
            });
    
            // Get the user's node and grab the example user
            const userTestRef = db.collection("Users").doc(VALID_USER_ID).collection("Cart").doc(documentID);
    
            await firebase.assertFails(userTestRef.set({
                "amountOfItemsToPurchase": firebase.firestore.FieldValue.increment(1000),
    
            }, {merge: true}));

此测试结果如下:Error: Expected request to fail, but it succeeded

我想要的每个场景(更新或创建),以避免amountOfItemsToPurchase 超过itemsLeft,为此我使用以下内容: request.resource.data.amountOfItemsToPurchase <= request.resource.data.itemsLeft => 这将在 allow create 部分中。

这会引起以下情况: allow create 或 allow update** 会被调用吗?还有为什么不考虑itemsLeft 变量

【问题讨论】:

  • 请编辑问题以显示未按预期方式运行的完整规则以及执行更新的客户端代码。只要您调用该操作,我不明白为什么您的条件不适用于更新,就像它对创建一样。无论哪种情况,您都拒绝了文档中不满足您的条件的新内容。
  • @DougStevenson 我更新了我的问题
  • 你的完整规则在哪里?请确保您尝试执行的操作实际上不仅适用于更新,也适用于创建。我建议他们应该工作正常。带有合并的更新要么是在首次创建文档时创建,要么是在文档已经存在时进行的更新。这种行为没有任何含糊之处。

标签: node.js google-cloud-firestore firebase-security


【解决方案1】:

根据您的描述和 cmets,您的安全规则看起来不错。
让我写它以供进一步讨论:

match /items/{id} {
    allow create, update: 
        if request.resource.data.amountOfItemsToPurchase < request.resource.data.itemsLeft;
}

第一个问题:使用request.resource 能够在更新之后读取字段的值。

第二个陷阱:当使用set 时,FieldValue.increment 哨兵不会增加,而是设置值。您应该使用update 函数来实际增加值。

第三个陷阱:FieldValue.incrementset 函数和 {merge: true} 确实增加了值!

所以最终该规则可以正常工作,我可以确认它对我有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2018-09-01
    • 2018-10-19
    相关资源
    最近更新 更多