为何.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
相关产品推荐
相关产品推荐

