Nat*_*ith 12 javascript ember.js firebase emberfire
我有两个Ember型号:a items和comments.用户将发布项目,其他用户将能够对项目发表评论.
我无法在firebase中设置允许name和description仅由当前用户写入的安全规则,但允许comments由任何登录用户写入.
项目
// app/models/item.js
export default DS.Model.extend({
name: DS.attr('string'),
description: DS.attr('string'),
comments: DS.hasMany('comment'),
user: DS.belongsTo('user')
})
Run Code Online (Sandbox Code Playgroud)
评论
// app/models/comment.js
export default DS.Model.extend({
user: DS.belongsTo('user')
body: DS.attr('string'),
timestamp: DS.attr('string'),
item: DS.belongsTo('user')
})
Run Code Online (Sandbox Code Playgroud)
保存评论
// app/components/comment-form.js
const comment = this.get('comment');
const item = this.get('item');
// service that tracks the currently logged in user
const currentUser = this.get('sessionManager.user');
comment.set('timestamp', new Date());
comment.set('user', currentUser);
// setup both sides of the relationship
item.get('comments').pushObject(comment);
comment.set('item', item');
// save both
return Ember.RSVP.Promise.all([item.save(), user.save()]);
Run Code Online (Sandbox Code Playgroud)
这一切都很好.今天,我在firebase中添加了安全规则.我只希望当前登录的用户能够编辑项目,但允许任何其他用户向任何项目添加注释.
"items": {
".read": "auth !== null",
"$item_id": {
// only the currently logged in user can write to this node
".write": "root.child('users/'+data.child('user').val()+'/uid').val() === auth.uid",
// allow any user to write comments
"comments": {
".write": "auth !== null"
}
}
},
Run Code Online (Sandbox Code Playgroud)
在firebase模拟器中这是有效的.作为拥有该项目的用户,我可以写信给/items/<item_id>/description.作为不拥有该项目的用户,我可以写信/items/<item_id>/comments/,但不能写信/items/<item_it>/description.然而它在Ember中使用Emberfire失败了.
我的工作理论是,当我向一个我没有"拥有"的项目添加新评论时,我会调用item.save()Emberfire尝试写入/items/<item_id>.
如何设置Firebase安全规则,以便只有拥有该用户的用户item才能更新其大部分属性,但任何用户都可以添加comment
这是在firebase规则模拟器中:
尝试/items/<item_id>/comments使用不具有此项目项的用户写入数据
{
"cde": "comment_id"
}
Run Code Online (Sandbox Code Playgroud)
将成功写上述规则.
然而,
尝试/items/<item_id>使用不具有此项目项的用户写入数据
{
"comments": {
"cde": "comment_id"
}
}
Run Code Online (Sandbox Code Playgroud)
失败.
问题是在.write规则中您使用了data 预定义变量并data引用:
表示尝试操作之前存在的数据的RuleDataSnapshot。
对于新项目,data.exists()将是false. 要允许用户编写新项目,您应该使用newData, 来代替:
".write": "root.child('users/' + newData.child('user').val() + '/uid').val() === auth.uid"
Run Code Online (Sandbox Code Playgroud)
而且,如果您想允许删除项目,您应该测试是否存在,如果不存在newData则使用:data
".write": "root.child('users/' + (newData.exists() ? newData.child('user').val() : data.child('user').val()) + '/uid').val() === auth.uid"
Run Code Online (Sandbox Code Playgroud)