gpt4 book ai didi

firebase - 在 firestore 文档中实现精细数据验证

转载 作者:行者123 更新时间:2023-12-03 06:41:06 25 4
gpt4 key购买 nike

假设我的数据库中有一个字 rune 档,即 /characters/{characterID}

该文档的形状可以如下:

{
username: "Username",
race: "ORC or ELF",
gender: "FEMALE or MALE",
gold: 1000,
equipement: {
helmet: "null or string",
boots: "null or string"
}
}

我想允许以下用例:

  1. 用户可以通过提供有效的用户名、种族、性别为自己创建角色,一旦创建角色,这些字段就不可编辑
  2. 其余字段可由用户一次性更新、每次更新或任意混合字段更新。 (一旦更新,就会触发 firebase 函数来验证这一点,但就规则而言,我们希望确保用户发送有效值)

我通过使用以下规则找出了第 1 步:validCreateCharacterData 验证用户名、种族和性别

service cloud.firestore {
match /databases/{database}/documents {

// Characters
match /characters/{characterID} {
allow create: if isOwner(characterID)
&& validCreateCharacterData();
}
}
}

但是我很难弄清楚如何验证其余的数据更新,因为它们可能为空或各种字段的混合。我想制定细粒度的规则,但以下方法不起作用:/

service cloud.firestore {
match /databases/{database}/documents {

// Characters
match /characters/{characterID} {
allow create: if isOwner(characterID)
&& validCreateCharacterData();

match /gold {
allow update: if request.resource.data.gold is number
}
}
}
}

最佳答案

当您使用match时,您实际上是在collection/document方向上又迈出了一步。因此,更新实际上是无效的,因为它是在集合而不是文档上执行的。

您的规则应如下所示:

service cloud.firestore {
match /databases/{database}/documents {

// Characters
match /characters/{characterID} {
allow create: if isOwner(characterID)
&& validCreateCharacterData();
function isValidEquipment(val) {
return val is string
|| val == null;
}
// don't allow a write request that includes updates to username, race, or gender
allow update: if !request.writeFields.hasAny(['username','race','gender'])
&& request.resource.data.gold is number
&& isValidEquipment(request.resource.data.equipment.helmet)
&& isValidEquipment(request.resource.data.equipment.boots);
}
}
}

关于firebase - 在 firestore 文档中实现精细数据验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51916848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com