Firebase Realtime Database 按用户名权限控制的安全规则配置咨询
Firebase Realtime Database 安全规则解决方案
前置准备
Realtime Database 安全规则无法直接读取 Cloud Firestore 的数据,因此需要先在 Realtime Database 新增身份映射节点,完成 Firebase Auth UID 到业务用户名的关联:
- 在根节点新增
uidToUsername节点,结构为uidToUsername -> {用户UID}: {对应用户名},用户注册/用户名绑定/修改时同步写入该节点,确保每个登录用户的UID都能匹配到对应的用户名。 - 你也可以选择将用户名写入 Firebase Auth 的自定义声明中,规则内可直接通过
auth.token.username读取用户名,省去映射节点的维护。
完整安全规则代码
{ "rules": { "users": { "$target_username": { // 仅用户本人可读取自己名下的全量数据 ".read": "auth != null && root.child('uidToUsername').child(auth.uid).val() === $target_username", "friends": { // 所有已登录用户可读取任意用户的friends数组 ".read": "auth != null" }, "myProfile": { // 本人或好友可读取myProfile ".read": "auth != null && (root.child('uidToUsername').child(auth.uid).val() === $target_username || (root.child('users').child($target_username).child('friends').exists() && root.child('users').child($target_username).child('friends').val().indexOf(root.child('uidToUsername').child(auth.uid).val()) !== -1))" } // 其他自定义字段默认仅本人可访问,如有特殊权限需求可参照上述逻辑扩展 } }, "uidToUsername": { "$uid": { // 仅用户本人可读取自己的UID-用户名映射,禁止公开遍历 ".read": "auth.uid === $uid", // 写入权限可根据业务调整,建议仅注册/用户名修改的服务端逻辑可写入,禁止客户端直接修改 ".write": false } } } }
规则说明
- 权限校验优先匹配子节点规则,即使没有目标用户根节点的读取权限,也可以正常读取授权的子节点(friends、符合条件的myProfile),完全匹配需求场景。
- 若采用自定义声明存储用户名,可将所有规则中
root.child('uidToUsername').child(auth.uid).val()替换为auth.token.username,代码更简洁,也无需维护uidToUsername节点。 - 上述规则仅覆盖读取权限,写入权限可根据业务需求自行补充。
内容的提问来源于stack exchange,提问作者Micha Wattenberg
相关产品推荐
相关产品推荐

