Firestore嵌套子集合写入报安全规则权限拒绝问题
问题原因
- 触发权限拒绝的核心原因是Firestore安全规则的匹配路径写法错误,没有覆盖你实际写入的目标文档。Firestore安全规则默认拒绝所有读写请求,只有请求路径完全落在某条规则的匹配范围内时,才会执行对应的权限校验逻辑。
- 你当前配置的规则
match /data-chats/{id}/clients/{clientId}/masseges仅匹配到masseges这个集合节点本身,没有覆盖该集合下的具体文档。而你调用addDoc接口是在masseges集合下创建新文档,请求路径属于集合下的文档层级,完全没有命中你配置的这条规则,因此直接触发默认拒绝逻辑。 - 额外核对:代码和规则里的集合名均拼写为
masseges(正确拼写应为messages),两边拼写一致,不存在路径名不匹配的问题。
修复方法
修改安全规则的匹配路径,在masseges集合层级后追加文档通配符,让规则覆盖该集合下的所有文档即可,修正后的规则示例:
match /data-chats/{id}/clients/{clientId}/masseges/{msgId} { allow read, write: if request.auth != null }
补充建议:当前规则只要用户登录就拥有该路径下所有文档的读写权限,存在越权风险。如果业务上要求只有聊天所属的用户本人可以操作对应数据,可以在规则中追加权限判断,比如加上
&& id == request.auth.uid的校验条件,限制只有路径中对应的uid用户本人能读写该聊天下的消息。如果后续要修正masseges的拼写错误,记得同步修改代码和规则里的路径名,避免出现路径不匹配的问题。
内容的提问来源于stack exchange,提问作者Richardson
相关产品推荐
相关产品推荐

