我正在努力为我的应用程序设置适当的安全规则。
我正在编写的应用程序概述是用户可以使用电子邮件和密码注册自己(我正在使用Firebase简单登录,这非常有效)。登录后,用户可以添加他们的待办事项。
angularFire('https://<firebase>/firebaseio.com/todos', $scope, '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()或一次()失败:错误: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.
答案 0 :(得分:16)
push
将随机生成的ID(按时间顺序)添加到/todos
的新子项。因此,newData
并未指向您认为它指向的内容。将您的规则更改为:
{
"rules": {
".read": true,
"todos": {
"$todoid": {
".write": "auth != null",
".validate": "auth.email == newData.child('user').val()"
}
}
}
}
更新:上述规则有效,但angularFire当前将整个阵列写回服务器,导致auth失败。您可以使用angularFireCollection来仅回写新的TODO,如下所示:
$scope.todos = angularFireCollection(new Firebase(URL));
$scope.todos.add({user: 'a@b.com', todo: 'What to do?'});
在将新项目添加到列表时,有一个未解决的问题可以优化angularFire的行为,但与此同时,您可以使用angularFireCollection来获得正确的行为。