Firebase安全规则是否允许拒绝权限?

cod*_*mer 13 firebase firebase-security

我正在努力为我的应用程序设置适当的安全规则.

我正在编写的应用程序概述是用户可以使用电子邮件和密码注册自己(我正在使用Firebase简单登录,这非常有效).登录后,用户可以添加他们的待办事项.

angularFire('https://<firebase>/firebaseio.com/todos', $scope, 'todos');
Run Code Online (Sandbox Code Playgroud)

为了向任何用户添加新的待办事项,我只需更新todos模型.

$scope.todos.push({
   user: 'a@b.com',
   todo: 'What to do?'
});
Run Code Online (Sandbox Code Playgroud)

这个安全规则我用来限制非注册用户添加任何待办事项:

  {
    "rules": {
      ".read": true,
      "todos": {
        ".write": "auth != null",
        ".validate": "auth.email == newData.child('user').val()"
      }
    }
  }
Run Code Online (Sandbox Code Playgroud)

但它甚至不允许经过身份验证的用户写入任何数据并抛出错误,"FIREBASE WARNING:on()或一次()/ todos失败:错误:permission_denied."

但是,如果我在模拟器中添加以下数据,那么它按预期工作.

{user: "a@b.com", todo: 'What to do?'} 
Run Code Online (Sandbox Code Playgroud)

这是日志:

/todos:.write: "auth != null"
    => true
/todos:.validate: "auth.email == newData.child('user').val()"
    => true
/todos:.validate: "auth.email == newData.child('user').val()"
    => true

Write was allowed.
Run Code Online (Sandbox Code Playgroud)

Ana*_*ant 16

push添加一个随机生成ID(按时间顺序)的新子项/todos.所以,newData并没有指出你认为它指向的东西.将您的规则更改为:

{
  "rules": {
    ".read": true,
    "todos": {
      "$todoid": {
        ".write": "auth != null",
        ".validate": "auth.email == newData.child('user').val()"
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

更新:上述规则有效但angularFire当前将整个阵列写回服务器,导致auth失败.您可以使用angularFireCollection来仅返回新的TODO,如下所示:

$scope.todos = angularFireCollection(new Firebase(URL));

$scope.todos.add({user: 'a@b.com', todo: 'What to do?'});
Run Code Online (Sandbox Code Playgroud)

当新项目添加到列表时,有一个未解决的问题可以优化angularFire的行为,但同时您可以使用angularFireCollection来获得正确的行为.