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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 12:15:00