Firestore规则异常:未授权仍可读写members集合问题排查
Firestore规则不生效的原因及修复方案
你的问题核心是规则匹配顺序导致全局通配符规则覆盖了具体集合规则,Firestore的规则按从上到下顺序匹配,只要有一条规则允许操作,后续规则就不会再执行。
问题分析
你最初的规则中,最顶部的match /{document=**}是全局通配符规则,允许所有登录用户读写任何集合(包括members)。所以不管你后面给members设置什么规则,这条全局规则已经先一步允许了操作,导致后续规则完全失效——哪怕你把members的读权限设为false,全局规则已经开了绿灯,自然还能读取数据。
修复方案
调整规则顺序,把具体集合的规则放在全局规则前面,最后用全局规则设置默认拒绝(或者直接移除全局规则,只显式定义需要开放的集合)。同时补充用户文档存在性检查,避免get()操作因文档不存在报错。
正确规则示例
service cloud.firestore { match /databases/{database}/documents { // 用户集合规则:仅允许自己读写,创建需登录 match /users/{userId} { allow create: if request.auth.uid != null; allow read, update, delete: if request.auth.uid == userId; } // 成员集合规则:仅允许已验证用户读写 match /members/{document=**} { allow read, write: if request.auth != null && exists(/databases/$(database)/documents/users/$(request.auth.uid)) && get(/databases/$(database)/documents/users/$(request.auth.uid)).data.verified == true; } // 默认规则:拒绝所有未显式授权的操作 match /{document=**} { allow read, write: if false; } } }
额外注意事项
- 规则测试用模拟器:不要只依赖应用测试,Firebase控制台的规则模拟器可以精准测试单条规则是否生效,避免应用缓存或权限干扰。
- 检查是否用了服务账号:如果你的React-admin应用使用了Firebase服务账号(管理员SDK),Firestore规则会被完全绕过,此时需要在代码层手动校验用户权限。
- 缓存问题:应用可能缓存了之前的数据,测试新规则时可以清除应用缓存或重启应用。
内容的提问来源于stack exchange,提问作者Martin Ruzek
相关产品推荐
相关产品推荐

