【发布时间】:2021-02-08 23:02:04
【问题描述】:
我有一个收藏,我想提供列表访问权限,但仅限于大多数用户。
所有用户都应该能够做到这一点:(字符串valuex可以是任何东西)
collection("XYZ").where("fieldx", "==", "valuex").get()
只有管理员可以获取所有文档:
collection("XYZ").get()
请注意,valuex 可以是任何东西,所以最终所有用户都可以看到所有文档。不同的是,非管理员需要知道要查询什么,而管理员不需要,他们可以直接得到。
我找到的唯一解决方案是强制非管理员在调用get 之前将他们正在查询的值写入文档。那么规则是:
allow list: if isadmin() || resource.data.fieldx == getvaluex();
function isadmin() { return request.auth.token.get("admin", false); }
function getvaluex() { return get(/databases/$(database)/documents/users/$(request.auth.uid).data.valuex; }
这样,所有返回的文档必须具有相同的 fieldx 值。但是这个解决方案 1) 需要 1 次额外写入 2) 在规则中添加读取 3) 在我的情况下,valuex 是敏感的,我不希望用户必须将其存储在 Firestore 中。
那么有没有更好的解决方案?
- 是否可以将索引的使用限制为仅限某些用户使用? (上述两个查询实际上都有更多的
where语句,并且每个查询都需要一个特定的复合索引)。 - 是否可以相互比较返回的文档以确保它们都具有相同的
fieldx值?
【问题讨论】:
标签: google-cloud-firestore firebase-security