如何配置Firebase Firestore安全规则仅允许按指定字段过滤的集合组查询
需求可实现,你的初始思路方向正确
仅需要对规则的判断逻辑做细化调整即可达到你的要求:
- 你最初写的
request.query.keys().hasAny(['id'])逻辑不够严谨,存在两个缺陷:- 没有明确匹配
where过滤条件中的字段,可能误匹配其他查询参数 - 没有限制为等值查询,可能放行范围查询等不符合要求的请求
- 没有明确匹配
- Firestore安全规则的
request.query.where对象可以获取到查询的所有过滤条件,我们可以基于该对象做精准校验
推荐最终安全规则
match /{path=**}/widgets/{widgetId} { allow list: if "id" in request.query.where.keys() && request.query.where.id.op == "=="; // 其他读写权限可根据自身业务需求补充 allow read, write: if false; }
额外可选收紧规则
如果你需要进一步限制用户一次只能查询单条记录,避免批量查询,可以增加limit判断:
match /{path=**}/widgets/{widgetId} { allow list: if "id" in request.query.where.keys() && request.query.where.id.op == "==" && request.query.limit == 1; }
规则效果验证
- 符合要求的查询
db.collectionGroup('widgets').where('id', '==', '123').get()可正常执行 - 无过滤条件的全量查询
db.collectionGroup('widgets').get()会被拦截 - 其他不符合要求的查询(如id字段的范围查询、不带id过滤的其他条件查询)均会被拦截
内容的提问来源于stack exchange,提问作者Johnny Oshika
相关产品推荐
相关产品推荐

