Firestore安全规则问题:实现用户仅访问对应schoolid的数据
Firestore 规则配置解决方案
你的原规则写法不符合Firestore规则语法,路径匹配不能直接嵌套其他集合的字段路径,正确的规则应该通过获取当前登录用户的schoolid,再与instituteTbl文档的schoolid做匹配来实现权限控制。
正确规则示例
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 配置userTbl权限:用户仅能访问自己的文档 match /userTbl/{userId} { allow read, write: if request.auth.uid == userId; } // 配置instituteTbl权限:仅允许schoolid匹配的登录用户访问 match /instituteTbl/{docId} { allow read, write: if request.auth != null && get(/databases/$(database)/documents/userTbl/$(request.auth.uid)).data.schoolid == resource.data.schoolid; } } }
规则说明
request.auth != null:确保访问请求来自已登录用户get(...):通过用户的Auth UID,从userTbl中获取该用户的schoolid值resource.data.schoolid:指代当前访问的instituteTbl文档中的schoolid字段- 两者相等时,才允许该用户进行读写操作
注意事项
- 确保
userTbl中的文档ID与用户的Firebase Auth UID完全一致(从你提供的截图来看,文档ID是用户UID,符合要求) - 批量查询
instituteTbl时,必须带上where("schoolid", "==", 用户的schoolid)条件,否则Firestore规则会拒绝查询(规则要求只能访问匹配schoolid的数据,不带条件的查询会被视为试图获取所有数据,违反规则)
你提供的数据结构说明
- userTbl:文档ID为用户Auth UID,包含
schoolid字段(字符串类型,如截图中的SCH001) - instituteTbl:每个文档包含
schoolid字段,与userTbl中的schoolid对应
内容的提问来源于stack exchange,提问作者Vivek Singh
相关产品推荐
相关产品推荐

