You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Firestore权限规则配置问题:仅允许成员组内用户读写权限却触发PERMISSION_DENIED错误

问题分析与解决方案

你的Firestore规则核心问题出在读操作时错误使用了request.resource.data,这个对象仅在写入(创建/更新文档)时才会存在,读取文档时应该用resource.data来访问文档的现有数据。

为什么原规则失效?

当你执行读查询时,request.resource是null,所以request.auth.uid in request.resource.data.Members这个条件永远不成立,直接触发权限拒绝。而你的写操作规则逻辑其实是没问题的,但读操作的判断逻辑完全错误。

修正后的规则

我们需要把读、写操作的权限逻辑分开处理:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /Users/{uid} {
      allow write: if request.auth != null && request.auth.uid == uid;
      allow read : if request.auth != null;
    }
    match /GroupChat/{document=**} {
      // 读操作:检查当前用户在文档的Members数组中
      allow read: if request.auth != null && request.auth.uid in resource.data.Members;
      // 写操作(创建/更新):检查当前用户在要写入的Members数组中
      allow create, update: if request.auth != null && request.auth.uid in request.resource.data.Members;
    }
  }
}

关键说明

  • resource.data:代表已经存在于Firestore中的文档数据,仅在读取或更新现有文档时可用。
  • request.resource.data:代表将要写入Firestore的新数据,仅在创建或更新文档时可用。
  • 你的查询where("Members", arrayContains: currentUser.uid)和修正后的读规则逻辑完全匹配,Firestore可以高效地验证权限,不会再出现权限拒绝的问题。

额外注意点

如果需要允许用户删除GroupChat文档,记得补充allow delete的规则,比如:

allow delete: if request.auth != null && request.auth.uid in resource.data.Members;

内容的提问来源于stack exchange,提问作者ismail

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.28 13:12:40