我需要列出类似的东西
clients/{clientId}/points/{pointId}
,此文档中的字段将类似于
point aaaa = { device: '1234', messages: 2, color: 'red'... },
point bbbb = { device: 'AAAA', messages: 2, color: 'red'... },
用户在令牌中拥有clientId和一系列设备
{
uid: 'abc',
token: {
clientId: 'test1',
devices: ['1234']
}
}
,我的安全规则如下所示。
service cloud.firestore {
match /databases/{database}/documents {
match /clients/{clientId} {
match /visible/{document=**} {
allow read: if request.auth.token.clientId == clientId
}
match /points/{$pointId} {
allow read, write: if request.auth.token.clientId == clientId && resource.data.device in request.auth.token.devices;
}
}
}
}
所以,如果我直接获得aaa点,它将起作用,但是如果我想获得所有点,例如
firestore.ref('path/to/points').where('color', '=', 'red')
我被拒绝访问。
那么我如何获得所有允许看到的点(成千上万)。
答案 0 :(得分:1)
这里的问题是安全规则不是过滤器。根据{{3}}:
在编写查询以检索文档时,请记住安全性 规则不是过滤器-查询是全有还是全无。为了节省您的时间, 资源,Cloud Firestore根据潜在查询评估查询 结果集,而不是所有您的实际字段值 文件。如果查询可能返回文档, 客户端没有读取权限,整个请求失败。
因此,如果整个查询可能无法读取结果集中的某些文档,则整个查询将失败。听起来您的查询并非专门返回用户可以通过其自定义声明阅读的文档。