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

Firebase规则:如何禁止users节点下非UID的其他子节点?

问题描述

我的数据库结构如下:

db
 \
  users
   \
    $uid
     \
      email: "john@email.com"
     \
      username: "John"

我已设置规则禁止用户在$uid节点下添加email和username之外的字段,规则如下:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        "email": {
          ".validate": "newData.isString()"
        },
        "username": {
          ".validate": "newData.isString()"
        },
        "$other": { ".validate": false } // 禁止其他字段
      }
    }
  }
}

该规则生效正常。我还希望禁止用户在users节点下创建除UID之外的其他节点,于是添加了如下规则:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        "$other": { ".validate": false } // 正常生效
      },
      "$other": { ".validate": false } // 此处无效
    }
  }
}

但保存规则时失败,报错:

Error saving rules - Line 9: Cannot have multiple default rules ('$uid' and '$other').

请问使用通配符时,如何禁止在users节点内添加其他节点?


解决方案

Firebase规则中,同一层级不能同时定义多个通配符(比如$uid和$other),因为它们都属于"默认规则"范畴,会产生冲突。要实现禁止在users节点下创建非UID节点的需求,可采用以下两种方法:

方法一:验证节点名称符合UID格式

如果你的UID是Firebase Auth生成的标准格式(如字母、数字、短横线组合),可直接在$uid的规则里验证节点名称的合法性,拦截不符合格式的节点。修改后的规则如下:

{
  "rules": {
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        // 验证节点名称为合法UID,可根据实际格式调整正则
        ".validate": "$uid.matches(/^[a-zA-Z0-9-]+$/)",
        "email": {
          ".validate": "newData.isString()"
        },
        "username": {
          ".validate": "newData.isString()"
        },
        "$other": { ".validate": false }
      }
    }
  }
}

方法二:限制users节点仅能包含当前用户的UID子节点

通过验证写入users节点的数据,确保其仅包含当前认证用户的UID节点,直接拦截其他类型的子节点创建:

{
  "rules": {
    "users": {
      // 验证写入内容只能包含当前用户的UID节点
      ".validate": "newData.hasChildren([auth.uid])",
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid",
        "email": {
          ".validate": "newData.isString()"
        },
        "username": {
          ".validate": "newData.isString()"
        },
        "$other": { ".validate": false }
      }
    }
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 13:33:35