【问题标题】:Firebase security rule gives permission denied?Firebase 安全规则授予权限被拒绝?
【发布时间】:2013-09-07 15:45:05
【问题描述】:

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

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

angularFire('https://<firebase>/firebaseio.com/todos', $scope, 'todos');

要针对任何用户添加新的 todo,我只需更新 todos 模型。

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

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

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

但它甚至不允许经过身份验证的用户写入任何数据并引发错误, “FIREBASE 警告:/todos 的 on() 或 once() 失败:错误:permission_denied。”

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

{user: "a@b.com", todo: 'What to do?'} 

这是日志:

/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.

【问题讨论】:

  • 您可以尝试使用 Forge 中的安全模拟器,看看为什么这不起作用。两个 cmets:1)您似乎正在编写一个包含一个对象的数组,它可能应该只是一个对象。 2) "$todos" 变量应该只是 "todos"。
  • @Anant:谢谢回复。正如您所说,我删除了 $ 并使用 ".validate": "auth.email == 'a@b.com'" 更改了验证规则,其中 a@b.com 是注册用户 - 这有效但不是 ".validate": "'a@b.com' == newData.child('user').val()"。是否可以看到 newData 有什么?
  • @Anant:我更新了这个问题,让你更清楚。正如您所说,不需要 $ 那么为什么在文档中到处都使用它?
  • 可能存在时间问题 - 即您尝试在身份验证完成之前推送数据。您是使用angularFireAuth 进行身份验证,还是通过FirebaseSimpleLogin 手动进行身份验证?
  • "$" 在文档中用作变量,即当您不知道该节点的值时。在您的情况下,“todos”是一个固定常量,因此您不需要“$”,但您确实需要像“$todoid”这样的子元素,或者只是“$id”来引用自动生成的推送对象。

标签: firebase firebase-security


【解决方案1】:

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

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

更新: 上述规则有效,但 angularFire 当前将整个数组写回服务器,导致身份验证失败。您可以改用 angularFireCollection,只写回新的 TODO,如下所示:

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

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

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

【讨论】:

  • 问题出在 angularFire 中,将解决方法发布到 firebase-talk 邮件列表(改用 angularFireCollection.add)。
猜你喜欢
  • 2016-11-27
  • 1970-01-01
  • 2018-06-05
  • 2021-10-20
  • 2020-03-22
  • 2020-08-16
  • 1970-01-01
  • 2014-10-04
  • 2011-10-17
相关资源
最近更新 更多