我有两个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') })
评论
// 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') })
保存评论
// 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()]);
这一切都很好.今天,我在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" } } },
在firebase模拟器中这是有效的.作为拥有该项目的用户,我可以写信给/items/
.作为不拥有该项目的用户,我可以写信/items/
,但不能写信/items/
.然而它在Ember中使用Emberfire失败了.
我的工作理论是,当我向一个我没有"拥有"的项目添加新评论时,我会调用item.save()
Emberfire尝试写入/items/
.
如何设置Firebase安全规则,以便只有拥有该用户的用户item
才能更新其大部分属性,但任何用户都可以添加comment
这是在firebase规则模拟器中:
尝试/items/
使用不具有此项目项的用户写入数据
{ "cde": "comment_id" }
将成功写上述规则.
然而,
尝试/items/
使用不具有此项目项的用户写入数据
{ "comments": { "cde": "comment_id" } }
失败.