gpt4 book ai didi

google-cloud-firestore - firestore 安全规则获取动态 key 的值?

转载 作者:行者123 更新时间:2023-12-04 16:27:23 26 4
gpt4 key购买 nike

文档结构:

{
[id 1] {
field1: "value",
field2: "value",
field3: "value"
}
[id 2] {
field1: "value",
field2: "value",
field3: "value"
}
[id 3] {
field1: "value",
field2: "value",
field3: "value"
}
}

map ID引用文档,不能硬编码,但每个 map 中的字段名称(field1,field2...)都是相同的

有没有办法检查任何 1 个映射中只有 1 个字段被更改,如果满足这些条件则允许写入?

最佳答案

为了将所有验证逻辑保留在 Firestore 中,您可以使用的一个技巧是为您的写入请求添加冗余。例如,您可以从客户端发送以下数据:

firestore.collection('A').doc('B').update({ 
'your_id_here': {
field1: 'my new value',

// keep old data, since we are updating a nested object
field2: 'original value',
field3: 'original value'
},

// this is the redundancy component
meta: { id: 'your_id_here' }
});

然后,您可以在您的 Firestore 规则中定义您的写入规则,如下所示:

function valid() {

// grab ID from "redundant" part of the request
let metaID = request.resource.data.meta.id;

// grab changed keys in the root of the document
let rootAftectedKeys = request.resource.data.diff(resource.data).affectedKeys();

// validate root keys; need to include "meta", since it is now also part of the object
let rootChangesGood = rootAffectedKeys.hasOnly([metaID, 'meta']);

// grab the nested object in question
let nestedObjectChanges = request.resource.data[metaID].diff(resource.data[metaID]).affectedKeys();

// check there was only one affected key
let nestedObjectChangesGood = nestedObjectChanges.size() == 1;

return rootChangesGood && nestedObjectChangesGood;
}
allow write: if valid();

如您所见,我正在使用 metaID 变量来动态访问对象的键。

这种方法的优点是 (1) 所有验证逻辑都在 Firebase 中,(2) 它比执行云功能要快得多(因为您只是直接与 Firestore 通信)。

然而,这种方法的缺点是,您将让这个 meta 对象四处 float ,供所有人查看。最重要的是,我将添加更多验证以确保 meta 对象本身仅具有正确格式的所需数据。我强烈建议彻底测试所有可能的情况。

关于google-cloud-firestore - firestore 安全规则获取动态 key 的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60790661/

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