使用集{merge}激发存储安全规则



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

  • 项目ID
    • 采购项目数量:1
    • 项目左:3

如果用户想更新要为相同ItemID购买的物品,或者在ItemsIDirestore安全规则,事情会变得复杂。

我写了以下测试:

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,为此我使用以下内容:CCD_ 5=>这将在允许创建部分。

这导致以下情况:是否将调用allow-create或allow-update**?以及为什么不考虑itemsLeft变量

从您的描述和评论来看,您的安全规则看起来还可以。
让我写下它以供进一步讨论:

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

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

第二个问题:当使用set时,FieldValue.incrementsentinel不递增,而是设置值。您应该使用set(, {merge:true}0函数来实际增加值。

第三个问题:具有set功能的FieldValue.increment{merge: true}确实增加了值!

所以最后这个规则还是很好的,我可以确认它对我有效

最新更新