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

Firebase实时数据库通配符使用失败,规则配置求助

Firebase实时数据库规则配置权限拒绝问题

问题背景

开发React Native聊天应用时,Firebase实时数据库users节点存储以uid为键的用户数据(包含email、emailVerified、publicKey、privateKey等字段)。代码通过读取users节点获取除自身uid外的所有用户邮箱等信息:

  • 当users节点直接设置.read: true时可正常读取
  • 使用$uid通配符配置规则时,出现权限拒绝无法获取数据
  • 需要通过通配符控制privateKey的访问权限

数据库数据示例

"users": {
    "0ayi220wJ0WOHfPftAwaxAAJh3P2": {
      "email": "oop3@gmail.com",
      "emailVerified": false,
      "publicKey": "",
      "privateKey": ""
    }
}

读取数据代码

onValue(firebaseDatabaseRef(firebaseDatabase, 'users'), async (snapshot) => {
    if (snapshot.exists()) {
        let stringUser = await AsyncStorage.getItem('user')     
        let myUserId = JSON.parse(stringUser)['uid']
        let snapShotObject = snapshot.val()
        setUsers(Object.keys(snapShotObject).filter((eachKey) => eachKey != myUserId)
            .map((eachKey: any) => {
            let eachObject = snapShotObject[eachKey]
            return {
                name: eachObject['email'],
                email: eachObject['email'],
                userId: eachKey,
            }
        }))
    }
    else {
        console.log('No data availble')
    }
})

原可行规则

{
  "rules": {
    "users": {
      ".read": true
    }
  }
}

权限拒绝的规则

{
  "rules": {
    "users": {
      "$uid": {
        ".read": true       
      }
    }
  }
}

问题原因

Firebase实时数据库的权限规则是路径级校验:

  • 代码读取的是整个/users节点,而报错的规则仅给了/users/$uid子节点的读权限,未给/users节点本身设置读权限
  • 读取父节点时,必须确保父节点本身具备读权限,否则即使子节点有权限,整个读取操作也会被拒绝

解决方案

要实现「允许读取所有用户的公开信息,但仅允许用户自己读取自身的privateKey」,可按以下规则配置:

{
  "rules": {
    "users": {
      ".read": true, // 允许读取整个users列表,获取所有用户的公开字段
      "$uid": {
        "privateKey": {
          // 仅当前认证用户能读取自己的privateKey
          ".read": "$uid === auth.uid"
        }
        // 其他字段(email、publicKey等)继承父节点的.read权限,默认允许读取
      }
    }
  }
}

规则说明

  1. 给users节点设置.read: true:确保代码能正常读取整个用户列表
  2. 针对$uid/privateKey子节点设置严格权限:只有用户自身的uid与节点键匹配时,才能读取该字段
  3. 其他公开字段(如email、publicKey)会继承父节点的读权限,无需额外配置

这样配置后,现有代码无需修改,既能获取所有用户的公开信息,又能保证privateKey字段的访问安全,不会被其他用户读取。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 05:05:37