Firebase中如何仅允许创建者增删改节点,其他用户不可操作?
Firebase实时数据库安全规则实现用户数据隔离
针对你提出的「用户仅能访问编辑自己创建的数据节点、允许空节点创建clips/clipOwners、禁止占用已存在pushKey」需求,我整理了一套针对性的安全规则,下面给你详细拆解:
核心思路
利用Firebase Auth的auth.uid作为用户唯一标识,通过clipOwners节点记录每个clips下pushKey的所有者,以此验证用户的操作权限,实现数据的完全隔离。
完整安全规则代码
{ "rules": { ".read": false, ".write": false, "clips": { "$pushKey": { // 读取权限:仅所有者能读取自己的clip节点 ".read": "root.child('clipOwners').child($pushKey).val() === auth.uid", // 写入权限:分创建、更新、删除三种场景 ".write": " // 场景1:创建新clip节点,需满足clipOwners对应节点不存在,且同时写入clipOwners记录自己为所有者 (!data.exists() && !root.child('clipOwners').child($pushKey).exists() && newData.parent().parent().child('clipOwners').child($pushKey).val() === auth.uid) || // 场景2:更新/删除已有clip节点,需是该节点的所有者 (data.exists() && root.child('clipOwners').child($pushKey).val() === auth.uid) " } }, "clipOwners": { "$pushKey": { // 读取权限:仅所有者能查看自己的所有权记录 ".read": "root.child('clipOwners').child($pushKey).val() === auth.uid", // 写入权限:分创建、更新、删除三种场景 ".write": " // 场景1:创建所有权记录,需对应clips节点不存在(确保pushKey未被占用),且记录的uid是当前用户 (!data.exists() && !root.child('clips').child($pushKey).exists() && newData.val() === auth.uid) || // 场景2:更新/删除所有权记录,需是该记录的所有者 (data.exists() && data.val() === auth.uid) " } } } }
规则细节解释
- 全局默认规则:根节点默认拒绝所有读写,确保未配置的节点不会被意外访问
- clips节点权限:
- 读取:只有
clipOwners中记录的所有者用户,才能读取对应的clip节点 - 创建:必须满足两个条件——当前clip节点不存在、对应的clipOwners节点也不存在,同时创建时要在clipOwners中写入自己的uid作为所有者,避免pushKey被抢占
- 更新/删除:只有该clip的所有者才能执行操作
- 读取:只有
- clipOwners节点权限:
- 读取:只有所有者能查看自己的所有权记录
- 创建:必须对应clips节点不存在(保证pushKey未被占用),且只能记录当前用户的uid
- 更新/删除:只有记录的所有者才能修改或删除这条所有权记录
这套规则完美实现了你要的所有需求:用户只能操作自己的节点、空节点允许创建、已占用的pushKey无法被其他用户抢占。
内容的提问来源于stack exchange,提问作者Joao Alves Marrucho
相关产品推荐
相关产品推荐

