【发布时间】: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