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

如何编写Firebase规则实现用户注册时创建同名UID子节点

问题:Firebase实时数据库安全规则配置(用户注册创建自属节点)

我用Pyrebase实现用户注册功能,创建用户后会在Firebase实时数据库的NGO节点下,以用户UID为子节点存储邮箱信息,代码如下:

def sign_up(email, password):
    # 创建用户并在NGO节点下以UID为子节点存储邮箱
    user = auth.create_user_with_email_and_password(email, password)
    uid = user['localId']
    db.child("NGO").child(uid).set({
        'email': email
    })
    return user

if __name__ == "__main__":
    config = {
        # API配置信息
    }
    firebase = pyrebase.initialize_app(config)
    db = firebase.database()
    auth = firebase.auth()
    user = sign_up(email, password)

当前规则存在的问题

规则1:过度授权

该规则给了所有用户NGO节点的全局写权限,存在严重安全隐患:

{
  "rules": {
    "NGO": {
      ".read": false,
      ".write": true,
      "$uid": {
        ".read": "auth.uid === $uid",
        ".write": "auth.uid === $uid"
      }
    }
  }
}

规则2:无法创建新节点

仅允许读写已存在的$uid子节点,无法满足注册时创建新节点的需求:

{
  "rules": {
    "NGO": {
      "$uid": {
        ".read": "auth.uid === $uid",
        ".write": "auth.uid === $uid"
      }
    }
  }
}

数据库结构

Firebase实时数据库NGO节点结构

需求

需要配置正确的安全规则,实现:

  • 用户注册时可创建自己UID对应的子节点
  • 用户仅能读写自己的节点
  • 避免过度授权

正确的安全规则配置

{
  "rules": {
    "NGO": {
      "$uid": {
        ".read": "auth.uid === $uid",
        ".write": "auth.uid === $uid && newData.exists() && newData.val().email === auth.token.email",
        ".validate": "newData.hasChildren(['email']) && newData.val().email is string"
      }
    }
  }
}

规则说明

  1. $uid节点的.read规则:仅允许已认证且UID匹配的用户读取自己的节点。
  2. $uid节点的.write规则:
    • auth.uid === $uid:确保只有用户自己能操作对应节点(包括创建新节点)
    • newData.exists():允许创建新节点(写入操作时newData存在)
    • newData.val().email === auth.token.email:验证写入的邮箱与用户认证邮箱一致,防止篡改
  3. .validate规则:限制写入数据必须包含email字段且为字符串类型,保证数据结构合规。

这种配置既满足注册时创建自属节点的需求,又严格限制了用户操作权限,消除了过度授权的安全隐患。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:57:26