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
相关产品推荐
相关产品推荐

