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

为何.indexOn: 'g'不再生效?Firebase规则配置问题求助

问题描述

我没法把activeDrivers的规则配置在正确位置,导致.indexOn: 'g'不生效。activeDrivers是数据库根节点的直接子节点,但新规则里我把它放到了drivers的子节点下,这明显不对,却不知道怎么改。


初始规则(几乎无安全限制)

{
  "rules": {
    ".read":true,
    ".write": true,
    "activeDrivers": {
      ".indexOn": ["g"]
    }
  }
} 

新规则(错误配置)

"rules": {
  "drivers": {
    "$uid": {
      ".read": "auth !== null && auth.uid === $uid",
      ".write": "auth !== null && auth.uid === $uid",
      "activeDrivers": {
        ".indexOn": ["g"]
      } 
    }
  }
}

数据库JSON结构

{
  "ALL Ride Requests": {
    "-NJlIOrp49pNBSuuEawT": {
      "destination": {
        "latitude": "41.929612",
        "longitude": "12.4858561"
      },
      "destinationAddress": "Duke's",
      "driverId": "waiting",
      "origin": {
        "latitude": "41.919225",
        "longitude": "12.5266267"
      },
      "originAddress": "Circonvallazione Nomentana, 270, 00162 Roma RM, Italy",
      "time": "2022-12-20 21:50:48.437521",
      "userName": "Peter Parker",
      "userPhone": "090012321354"
    },
  },
  "activeDrivers": {
    "31uMBJKvl6PF7BVKQnqHORTrWRP2": {
      ".priority": "sr2yt23wk8",
      "g": "sr2yt23wl8",
      "l": [
        41.926275,
        12.5376567
      ]
    },
    "G3OJ79KiLeMmxqoUpJ1NggIKbiF2": {
      ".priority": "sr2yt23wk8",
      "g": "sr2yt23rk8",
      "l": [
        41.926275,
        12.5376567
      ]
    },
    "filTJu3xjiQYTzehD71kzY1Oybz1": {
      ".priority": "sr2yt23wk8",
      "g": "sr2yy23wk8",
      "l": [
        41.926275,
        12.5376567
      ]
    }
  },
  "drivers": {
    "G3OJ79KiLeMmxqoUpJ1NggIKbiF2": {
      "earnings": "0.0",
      "email": "simo@hotmail.it",
      "id": "G3OJ79KiLeMmxqoUpJ1NggIKbiF2",
      "name": "Simone Demichele Test",
      "newRideStatus": "idle",
      "password": "testpassword",
      "phone": "3452362585",
      "token": "fFIwv1IHRv2ylXyW-qRVGQ:APA91bH7IfcNBBi7Y53wRjQKN12-nBUgFHHpf7F0LeWCstG_MIqt-mkobRN6nvUZxqbMnMlXU2yMHdE-efYykUdtcXl-91wW5rGyQcpMl6Dij6bxC8snQRkAMGBhQUmyqYW6sBhY6Ul3"
    },
    "Gzs0qxNiE6VZrwNGPYpFPRB7J8p1": {
      "email": "giacomo@gmail.com",
      "id": "Gzs0qxNiE6VZrwNGPYpFPRB7J8p1",
      "name": "giacomo",
      "newRideStatus": "idle",
      "phone": "134634564352",
      "token": "cdG8W0lFRZ2F0jAeG2WbnO:APA91bHTtbtSg18sPNxcH92TIdM3UuX-qcim2-h0I_1YPcBgucIGO0I3ACIQEGVpmsg-EKcRZXFIMIXlxGk1iBw-V0hmDZBVWDyFh44yH2iM8fZgrhRsQzyVBdXdLxGMI0Vz67hQFUQU"
    },
    "OLhsoowb9FXTBtWQmGysGLLBgNz2": {
      "email": "gino@gmail.com",
      "id": "OLhsoowb9FXTBtWQmGysGLLBgNz2",
      "name": "Gino",
      "phone": "4568965432",
      "token": "ewktnxHKRSCBWwilm_SDfd:APA91bFchfCs_33zZNGNtbUHPf6TBC3Vrua7U4QT0bX_e4cr6Z62XSPr5TwZyL-BQ12fmDa3XKnAqeLDQy7NMUKp9m8bq676jS_i5n1vjNMFYJ4tHfIYjntEwYKvOcsTp0yh4ZSvjuxb"
    },
    "ZYqM7SbG3IhRBAGCfXRZHHs7XdG3": {
      "email": "laura@gmail.com",
      "id": "ZYqM7SbG3IhRBAGCfXRZHHs7XdG3",
      "name": "Laura",
      "newRideStatus": "idle",
      "phone": "1212432554325",
      "token": "cdG8W0lFRZ2F0jAeG2WbnO:APA91bHTtbtSg18sPNxcH92TIdM3UuX-qcim2-h0I_1YPcBgucIGO0I3ACIQEGVpmsg-EKcRZXFIMIXlxGk1iBw-V0hmDZBVWDyFh44yH2iM8fZgrhRsQzyVBdXdLxGMI0Vz67hQFUQU"
    },
    "filTJu3xjiQYTzehD71kzY1Oybz1": {
      "email": "maria@gmail.com",
      "id": "filTJu3xjiQYTzehD71kzY1Oybz1",
      "name": "Maria",
      "newRideStatus": "idle",
      "phone": "3726761919",
      "token": "fFIwv1IHRv2ylXyW-qRVGQ:APA91bH7IfcNBBi7Y53wRjQKN12-nBUgFHHpf7F0LeWCstG_MIqt-mkobRN6nvUZxqbMnMlXU2yMHdE-efYykUdtcXl-91wW5rGyQcpMl6Dij6bxC8snQRkAMGBhQUmyqYW6sBhY6Ul3"
    }
  },
  "users": {
    "yHc7xseCT0QePnpolGHZvdr8ARV2": {
      "email": "peter@gmail.com",
      "id": "yHc7xseCT0QePnpolGHZvdr8ARV2",
      "name": "Peter Parker",
      "phone": "090012321354"
    }
  }
}

查询代码

Position pos = await Geolocator.getCurrentPosition(
      desiredAccuracy: LocationAccuracy.high,
    );
    driverCurrentPosition = pos;

    Geofire.initialize("activeDrivers");
    
    Geofire.setLocation(
        currentFirebaseUser!.uid,
        driverCurrentPosition!.latitude,
        driverCurrentPosition!.longitude
    );

解决方案

正确的规则配置

把activeDrivers的规则移到根节点下,和drivers同级,同时设置合适的读写权限(可根据业务需求调整),保留.indexOn: ["g"]:

{
  "rules": {
    "drivers": {
      "$uid": {
        ".read": "auth !== null && auth.uid === $uid",
        ".write": "auth !== null && auth.uid === $uid"
      }
    },
    "activeDrivers": {
      ".read": "auth !== null", // 允许所有已认证用户读取,可按需调整
      ".write": "auth !== null", // 允许所有已认证用户写入,可按需调整
      ".indexOn": ["g"]
    }
  }
}

关键说明

  • 数据库中activeDrivers是根节点直接子节点,规则必须对应相同层级,否则索引无法生效。
  • 读写权限可根据实际业务细化,比如只允许司机写入自己的位置记录,或者限制用户仅能读取附近司机数据等。
  • 配置完成后,在Firebase控制台发布新规则,再测试查询是否正常使用索引。

内容的提问来源于stack exchange,提问作者Simone

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 18:30:49