gpt4 book ai didi

javascript - Firebase 安全规则 Emberfire 每个节点的多个访问级别

转载 作者:可可西里 更新时间:2023-11-01 02:12:32 24 4
gpt4 key购买 nike

我有两个 Ember 模型:一个 itemscomments .用户将发布一个项目,其他用户将能够对该项目发表评论。

我无法在 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/<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"
}

将成功写入上述规则。

但是,

尝试写入 /items/<item_id>与不拥有此项目项目的用户一起使用数据

{
"comments": {
"cde": "comment_id"
}
}

失败。

最佳答案

问题是在 .write 规则中你使用了 data predefined variable data 是指:

A RuleDataSnapshot representing the data as it existed before the attempted operation.

对于新项目,data.exists() 将为 false。要允许用户编写新项目,您应该使用 newData,而不是:

".write": "root.child('users/' + newData.child('user').val() + '/uid').val() === auth.uid"

而且,如果你想允许删除项目,你应该测试 newData 是否存在,如果不存在则使用 data:

".write": "root.child('users/' + (newData.exists() ? newData.child('user').val() : data.child('user').val()) + '/uid').val() === auth.uid"

关于javascript - Firebase 安全规则 Emberfire 每个节点的多个访问级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41863045/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com