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
相关产品推荐
相关产品推荐

