You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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}路径仅本人可访问规则不生效

问题原因

两个错误导致规则未匹配到目标路径:

  1. 你编写的joined规则没有嵌套到正确的父路径层级下,规则引擎无法命中/game_lookup/contest/tournament_players_list/{listId}/joined/{userId}路径
  2. 路径通配符命名和规则引用变量名不匹配,你用{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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 17:54:02