如果写入/验证规则依赖于更新的多个部分,则更新/事务将失败

时间:2016-08-07 01:12:01

标签: firebase-realtime-database firebase-security

如果更新的一部分具有取决于更新的另一部分的规则,则更新和事务将失败。

用户创建示例

规则

{ 
  "rules": {
      // Private user data
      "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
    // Public user data
    "profiles": {
      ".read": true,
      "$uid": {
        // The authed user can write only if they exist in /users.
        ".write": "$uid === auth.uid && root.child('users/' + $uid).exists()"
      }
    }
  }
}

更新功能

function createUser(uid, user, profile) {
  var updates = [];
  updates['/users/' + uid] = user;
  updates['/profiles/' + uid] = profile;

  // This will fail
  firebase.app().database().ref().update(updates, onComplete);
}

function onComplete(error) {
  if (error) console.log('error:', error);
  else console.log('success');
}

1 个答案:

答案 0 :(得分:1)

您正在检查root,它指的是更新前存在的数据。

要检查新数据,请从newData变量开始。如果您需要引用根目录下的数据,则意味着您需要使用多个parent()来回到顶部。

{ 
  "rules": {
    "profiles": {
      ".read": true,
      "$uid": {
        ".write": "$uid === auth.uid &&
                   newData.parent().parent().child('users/' + $uid).exists()"
      }
    },
    "users": {
      "$uid": {
        ".read": "$uid === auth.uid",
        ".write": "$uid === auth.uid"
      }
    }
  }
}