Firestore规则中$(universe)变量权限验证失效问题求助
问题分析与解决方案
你的规则失效的核心原因是路径不匹配——你写的规则只针对universes/{universe}下的子资源(子集合、子文档)生效,但你的查询是直接读取universes集合本身的文档,当前规则完全没覆盖这个路径的权限检查。
具体细节
- 当你执行
FirebaseFirestore.instance.collection('universes').snapshots()时,Firestore会检查/universes/{universe}这个路径的读取权限,但你的规则里只有match /universes/{universe}/{document=**},这个匹配的是universes下某文档的所有子路径(比如universes/my-universe/characters这类),和你查询的集合文档路径不沾边。 - 硬编码文档名时,你相当于手动指定了某个具体的
/universes/xxx路径,刚好命中了规则里的get逻辑,但这只是巧合,本质上还是没覆盖集合文档的权限规则。
修正后的完整规则
service cloud.firestore { match /databases/{database}/documents { match /usernames/{username} { allow read: if true; allow write: if request.auth != null; } match /users/{userId} { allow read, write: if request.auth != null; } // 处理universes集合下的文档读写权限 match /universes/{universe} { allow read, write: if request.auth != null && resource.data.isPublic == true; } // 处理universes下文档的所有子资源读写权限 match /universes/{universe}/{document=**} { allow read, write: if request.auth != null && get(/databases/$(database)/documents/universes/$(universe)).data.isPublic == true; } } }
修正说明
- 新增
match /universes/{universe}规则,专门处理universes集合中文档的读写:- 用
resource.data.isPublic直接检查当前文档的公开状态,不需要额外调用get,更高效。
- 用
- 保留原有的子资源规则,确保
universe下的所有子文档/子集合都继承父文档的公开权限。
修改后,已认证用户查询universes集合时,Firestore会逐个检查每个文档的isPublic字段,只有标记为true的文档会被返回,完全符合你的需求。
内容的提问来源于stack exchange,提问作者user3453305
相关产品推荐
相关产品推荐

