Firebase Firestore分组集合与嵌套子集合差异化安全规则配置问题
问题1:无法访问/game_lookup下非contest文档的子集合资源
问题原因
你当前编写的规则仅对/game_lookup/{document}下的tournament、tournament_players_list、tournament_template三个子集合做了权限声明,而/game_lookup/arcade/master、/game_lookup/arcade/level_-6NVwtc0cp-/1这类路径对应的子集合不在规则覆盖范围内,Firestore安全规则默认拒绝所有未明确授权的访问,因此请求被拦截。
解决方法
将contest文档的专属规则和其他文档的通用规则拆分,更具体的规则写在前面,通用规则放在后面匹配剩余场景:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { // 复用你原有鉴权方法 function isAuthenticated() { return request.auth != null; } // contest文档专属规则,仅匹配contest下的路径 match /game_lookup/contest { allow read: if isAuthenticated(); match /tournament/{document} { allow read: if isAuthenticated(); } match /tournament_players_list/{document} { allow read, write: if isAuthenticated(); match /allusersPostion/{document} { allow read, write : if false; } match /percentile/{document} { allow read, write : if false; } } match /tournament_template/{document} { allow read, write : if false; } } // 其他文档统一规则,**表示匹配该文档下所有嵌套子集合、子文档 match /game_lookup/{otherDoc=**} { // 可根据实际业务调整权限,示例为认证用户即可访问 allow read, write: if isAuthenticated(); } } }
问题2:/joined/{userId}路径仅本人可访问规则不生效
问题原因
两个错误导致规则未匹配到目标路径:
- 你编写的
joined规则没有嵌套到正确的父路径层级下,规则引擎无法命中/game_lookup/contest/tournament_players_list/{listId}/joined/{userId}路径 - 路径通配符命名和规则引用变量名不匹配,你用
{document}作为通配符,却在规则里引用userId变量,取不到对应路径段的值
解决方法
将joined的匹配规则嵌套到tournament_players_list的匹配块内,修正通配符命名:
match /tournament_players_list/{listDoc} { allow read, write: if isAuthenticated(); match /allusersPostion/{document} { allow read, write : if false; } match /percentile/{document} { allow read, write : if false; } // 新增正确的joined路径规则 match /joined/{userId} { allow read, create, update: if isAuthenticated() && request.auth.uid == userId; } }
注意事项
- 必须声明
rules_version = '2',否则递归通配符=**的匹配逻辑会出现异常 - 规则匹配遵循从上到下的优先级,更具体的路径规则必须放在通用规则前面,避免被通用规则提前拦截
内容的提问来源于stack exchange,提问作者cakePHP
相关产品推荐
相关产品推荐

