Firestore如何编写规则公开读取含startupData字段的users集合文档
Firestore安全规则问题修复
现有规则的错误点
- 第二条
allow read规则中的get()路径写法错误:使用通配符{document=**}无法定位到当前正在访问的具体用户文档,根本读不到目标文档的startupData字段,规则判断完全失效。 - 冗余调用
get()读取当前匹配文档:安全规则内置resource对象可以直接获取当前待访问文档的快照,不需要额外发起文档读取请求,额外的get()调用还会消耗安全规则的读取配额。 - 缺少字段存在性校验:如果目标文档没有
startupData字段,直接读取字段值会触发规则计算错误,直接拦截合法请求。
携带startupData字段的文档示例:
可直接使用的正确规则
match /databases/{database}/documents { match /users/{uid} { // 满足任意一个条件即允许读取:1. 访问者为文档对应的登录用户本人 2. 文档存在startupData字段(公开可读) allow read: if request.auth.uid == uid || ('startupData' in resource.data); } }
规则逻辑说明
- 规则判断采用逻辑或连接,两个条件满足任意一个就会放行读请求,不需要写多条
allow read规则。 - 用
'startupData' in resource.data判断字段是否存在,兼容startupData字段存储任意类型值的场景,不会因为字段缺失抛出规则错误。 - 未登录状态下,用户只能访问带
startupData字段的公开用户文档,访问其他用户的私有文档会被直接拦截。
内容的提问来源于stack exchange,提问作者Sulman Azhar
相关产品推荐
相关产品推荐

