gpt4 book ai didi

google-cloud-firestore - Firestore 安全规则 : How to constrain queries that use get()?

转载 作者:行者123 更新时间:2023-12-04 13:32:46 26 4
gpt4 key购买 nike

所以我有一个查询(失败)。它是这样写的:“作为我的用户,我可以列出一个组织的所有业务,我是其中的一部分”。

fs
.collection('businesses')
.where('organizationUid', isEqualTo: 'some-organization-id')
.get();
以及保护它的安全规则(要点):
match /businesses/{businessId} {
function isStaffOrHigher() {
return get(/databases/$(database)/documents/businesses/$(businessId)/users/$(request.auth.uid)).data.role >= 50;
}

allow read: if isStaffOrHigher();

match /orders/{orderId} {
allow read, write: if isStaffOrHigher();
}

match /users/{userId} {
allow read: if request.auth.uid == userId || isStaffOrHigher();
}
}
基本上,它在用户文档(由该企业拥有)中查找用户的角色。这种类型的规则(使用 get() 运算符)适用于 orders 的子集合(例如,查询 {businessId} 没有问题) ,但不适用于尝试列出商家的查询。
现在我知道 organizationUid是一个有效的约束,但已阅读 Rules are not filters ,我可以理解为什么 Firestore 无法在不读取大量数据的情况下验证此声明。
问题只是,那么我该如何解决这个问题? Firestore 如何正确验证子集合的约束?

最佳答案

安全规则不会执行您想要的操作,因为它会涉及为 阅读另一份文档。每查询匹配的文档。规则无法提前知道这些文档将是什么,因为路径中有变量 ( businessId )。如果此查询将产生业务集合的数百万个文档,您可以看到从/businesses/$(businessId)/users/$(request.auth .uid) 以确定是否应允许拒绝整个查询。
规则必须以极快的速度运行,以便按照 Firestore 需要的扩展方式进行扩展。规则不能作为过滤器的限制是可扩展性要求的一部分。这也是为什么使用 get() 读取的文档总数限制为 10 个的原因。每个规则评估。
从规则的角度来看,这里没有解决方法,除了执行多个查询,每个查询都在每个集合的规则范围内,并在您的客户端应用程序中合并结果。

关于google-cloud-firestore - Firestore 安全规则 : How to constrain queries that use get(<document_path>)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64061537/

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