
在Firestore中,有时我们需要存储结构化数据,其中字段名称是动态生成的,例如使用UUID作为键来存储一系列子对象。考虑以下文档结构,其中-6e219b89-98fb-44cd-b6ad-e22888b6fb2f和-345c635a-11cb-4165-86ef-50be50794532是动态生成的UUID:
// Firestore Document
{
"-6e219b89-98fb-44cd-b6ad-e22888b6fb2f": {
"name": "Harry",
"age": 20
},
"-345c635a-11cb-4165-86ef-50be50794532": {
"name": "Mary",
"age": 30
}
}当客户端代码尝试向此文档添加一个新的动态字段时,例如:
await updateDoc(docRef, {
[crypto.randomUUID()]: {
name: 'Sally',
age: 24,
}
});我们希望通过Firestore安全规则来验证新添加的字段是否符合预期的结构,即它是一个包含name(字符串类型)和age(数字类型)的Map。然而,Firestore安全规则的一个核心限制是它们无法迭代或动态推断字段名称。规则必须明确知道要检查的字段路径。例如,如果字段名已知,我们可以这样写规则:
// 假设字段名已知为 'someKnownField'
allow write: if request.resource.data.someKnownField.name is string &&
request.resource.data.someKnownField.age is number;但对于动态生成的UUID字段,这种直接的路径引用是不可行的,因为在编写规则时我们无法预知其名称。
为了解决这个问题,我们可以采用一种策略:在客户端写入动态字段的同时,额外写入一个“已知”字段,用于存储这个动态字段的键(UUID)。这样,Firestore安全规则就可以通过这个已知的字段来获取动态字段的名称,并进而验证其结构。
修改后的客户端写入操作将包含两部分:一是实际的动态字段及其数据,二是用于存储动态字段键的引用字段(例如,命名为newField)。
import { doc, updateDoc } from 'firebase/firestore';
import { db } from './firebaseConfig'; // 假设你的Firestore实例
async function addNewPerson(docId) {
const docRef = doc(db, 'yourCollection', docId); // 替换为你的集合和文档ID
const uuid = crypto.randomUUID(); // 生成动态UUID
await updateDoc(docRef, {
newField: uuid, // 存储新添加字段的UUID
[uuid]: { // 动态字段
name: 'Sally',
age: 24,
}
});
console.log(`Successfully added new person with UUID: ${uuid}`);
}
// 示例调用
// addNewPerson('someDocumentId');在这个修改后的操作中,newField字段的值将是新添加的动态字段(例如uuid)的键。
现在,Firestore安全规则可以利用request.resource.data.newField来获取动态字段的名称,然后使用方括号语法来访问和验证该动态字段的结构。
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /yourCollection/{docId} { // 替换为你的集合路径
allow update: if request.resource.data.newField is string && // 确保newField存在且是字符串
request.resource.data[request.resource.data.newField] is map && // 确保动态字段是一个map
request.resource.data[request.resource.data.newField].name is string && // 验证name字段
request.resource.data[request.resource.data.newField].age is number; // 验证age字段
}
}
}规则解释:
通过这种方式,即使字段名是动态的,安全规则也能通过一个已知的中间字段来“定位”并验证其结构和内容。
尽管Firestore安全规则不直接支持迭代动态字段,但通过引入一个“已知引用字段”来存储动态字段的键,我们可以有效地绕过这一限制。这种方法使得安全规则能够精确地定位并验证新添加的动态字段的结构和数据类型,从而在保持数据模型灵活性的同时,确保了数据完整性和安全性。在实施时,需根据实际需求权衡newField的生命周期管理和整体数据模型设计。
以上就是在Firestore中使用安全规则验证动态生成的文档字段的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号