Firestore规则中无法访问resource.id返回权限不足的解决方法
问题核心原因
Firestore 安全规则不支持父级规则自动继承到子集合,只有查询路径精确命中对应match块时,规则才会生效:
- 你最初的规则仅给
/All%20Schools/{schoolID}这一级的学校文档配置了权限,而你实际查询的是学校文档下的Classrooms子集合,完全没有命中你写的学校层级match规则,所以会直接返回权限不足错误。 - 另外在匹配学校ID时,直接使用
match块中定义的通配符变量schoolID即可,无需调用resource.id,两者值完全一致但前者写法更简洁,也不会出现上下文取值错误。
优化建议
如果你需要让某所学校下的所有子集合都复用同一条权限校验逻辑,无需逐个给子集合写规则,可以直接用递归通配符简化配置:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { function signedIn() { return request.auth.uid != null; } function getUserData() { return get(/databases/$(database)/documents/All%20Users/$(request.auth.uid)).data; } match /All%20Users/{userID} { allow read,write: if signedIn() && request.auth.uid == userID; } // 匹配学校下所有层级的文档,包括学校文档本身和所有子集合文档 match /All%20Schools/{schoolID}/{document=**} { allow read, write: if signedIn() && getUserData().school == schoolID; } } }
上述规则覆盖了你原本单独配置的Classrooms、Student List、Staff三个子集合的权限需求,代码更简洁也便于后续维护。
内容的提问来源于stack exchange,提问作者JaredGibb
相关产品推荐
相关产品推荐

