如何编写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" } } } }
数据库结构

需求
需要配置正确的安全规则,实现:
- 用户注册时可创建自己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" } } } }
规则说明
$uid节点的.read规则:仅允许已认证且UID匹配的用户读取自己的节点。$uid节点的.write规则:auth.uid === $uid:确保只有用户自己能操作对应节点(包括创建新节点)newData.exists():允许创建新节点(写入操作时newData存在)newData.val().email === auth.token.email:验证写入的邮箱与用户认证邮箱一致,防止篡改
.validate规则:限制写入数据必须包含email字段且为字符串类型,保证数据结构合规。
这种配置既满足注册时创建自属节点的需求,又严格限制了用户操作权限,消除了过度授权的安全隐患。
内容的提问来源于stack exchange,提问作者karthik nair
相关产品推荐
相关产品推荐

