Firebase Firestore安全规则不生效,权限拒绝问题求助
解决Firestore安全规则权限拒绝问题
看起来你被Firestore的安全规则权限拒绝问题给困住了,我来帮你分析下你尝试的规则里的问题,再给你适配你数据库结构的正确方案:
你现有规则的问题分析
第一个规则:
这个规则的根匹配路径不符合Firestore规则的要求——所有规则必须从/databases/{database}/documents开始定义,而且内部的match / {docs = **}语法错误(正确写法是match /{documents=**})。更关键的是,它只覆盖了users集合,完全没处理sessions集合,所以当你访问sessions时,会触发Firestore默认的拒绝规则。第三个规则:
这个规则同样只覆盖了users集合及其子文档,没有包含sessions集合,访问sessions数据时依然会被拒绝。第四、第五个规则:
这两个规则只处理了sessions集合,没覆盖users集合,如果你同时访问users数据的话会被拒绝。另外,即使是针对sessions的规则,也要确认你的客户端代码确实已经完成了Firebase认证——如果用户没有登录,request.auth会是null,自然会触发权限拒绝。
适配你数据库的正确规则
根据你的需求(仅已认证用户可访问数据库),分两种场景给出规则:
场景1:所有已认证用户可访问所有集合(users + sessions)
如果不需要区分用户权限,只要是登录用户就能访问任何数据,用这个规则:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 匹配所有文档和子集合 match /{document=**} { allow read, write: if request.auth != null; } } }
场景2:精细化权限(用户仅能访问自己的users文档,所有已认证用户可访问sessions)
如果想让users集合只能由对应UID的用户访问,同时开放sessions给所有登录用户,用这个:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 限制用户只能访问自己的users文档及其子内容 match /users/{userId}/{documents=**} { allow read, write: request.auth != null && request.auth.uid == userId; } // 所有已认证用户可访问sessions集合的所有内容 match /sessions/{sessionId}/{documents=**} { allow read, write: request.auth != null; } } }
关键排查步骤
如果设置正确规则后还是权限拒绝,一定要做这几步:
- 确认客户端认证状态:在请求Firestore数据前,确保用户已经完成Firebase登录,比如通过
firebase.auth().currentUser检查是否有当前用户,避免在认证完成前发起请求。 - 用规则模拟器测试:在Firebase控制台的Firestore规则页面,使用内置的模拟器,输入认证UID,模拟读/写请求,看规则是否能通过,这样可以快速定位是规则问题还是客户端代码问题。
- 检查初始化代码:确认你的客户端代码正确初始化了Firebase Auth和Firestore模块,没有遗漏认证相关的配置。
内容的提问来源于stack exchange,提问作者Davtho1983
相关产品推荐
相关产品推荐

