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权限,默认允许读取 } } } }
规则说明
- 给
users节点设置.read: true:确保代码能正常读取整个用户列表 - 针对
$uid/privateKey子节点设置严格权限:只有用户自身的uid与节点键匹配时,才能读取该字段 - 其他公开字段(如email、publicKey)会继承父节点的读权限,无需额外配置
这样配置后,现有代码无需修改,既能获取所有用户的公开信息,又能保证privateKey字段的访问安全,不会被其他用户读取。
内容的提问来源于stack exchange,提问作者nhoclahola
相关产品推荐
相关产品推荐

