Firestore规则异常:无法基于Facilitators集合文档值授权访问Kids集合
Firestore规则修正方案
原规则的问题主要有两点:
- 路径嵌套错误:你把
/Kids和/Teens的规则放在了/Facilitators/{facilitators}下面,这会让规则只作用于Facilitators文档的子集合,而非根级的Kids、Teens集合。 - 权限判断逻辑错误:原函数里的
resource指的是当前访问的目标文档(比如Kids里的某条数据),不是Facilitators中对应用户的权限文档,根本拿不到用户的权限字段。
修正后的规则直接在根层级匹配目标集合,通过get()函数读取Facilitators中对应用户的权限文档来判断权限:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 通用权限检查函数:验证用户认证状态+对应权限字段是否为"Yes" function hasPermission(permissionField) { // 先确保用户已完成认证 if (!request.auth) return false; // 获取Facilitators中与用户邮箱同名的权限文档 let facilitatorDoc = get(/databases/$(database)/documents/Facilitators/$(request.auth.email)); // 检查指定权限字段值 return facilitatorDoc.data()[permissionField] == "Yes"; } // 根级Kids集合的读取权限控制 match /Kids/{kid} { allow read: hasPermission("BeAHero"); } // 根级Teens集合的读取权限控制 match /Teens/{teen} { allow read: hasPermission("YouAreUnstoppable"); } // 可选:控制Facilitators集合自身的访问权限(仅用户能读写自己的文档) match /Facilitators/{facilitatorId} { allow read, write: if request.auth != null && facilitatorId == request.auth.email; } } }
关键说明:
- 用
get(/databases/$(database)/documents/Facilitators/$(request.auth.email))直接定位到用户邮箱对应的权限文档,确保能准确读取权限字段。 - 提取通用的
hasPermission函数,减少重复代码,后续新增权限判断更便捷。 - 先判断
request.auth != null,避免未认证用户触发无效的文档读取,同时降低规则执行成本。
如果你的Facilitators文档不是用邮箱作为文档ID,而是通过文档内的email字段匹配,由于Firestore规则不支持查询操作,建议改为将文档ID设为用户邮箱,这样能保证权限判断的高效性和准确性。
内容的提问来源于stack exchange,提问作者Peter Bonnebaigt
相关产品推荐
相关产品推荐

