【发布时间】:2017-07-25 13:16:14
【问题描述】:
几天来,我一直在尝试向我的 Firebase 数据库添加规则,但不断弹出错误,我找不到问题所在。
有错误:
FIREBASE 警告:更新/失败:permission_denied
PERMISSION_DENIED:权限被拒绝
我搜索了解决方案并找到了一些相关的帖子 (Permission denied error during multiple update on Firebase)。似乎显示的错误不对。我虽然得到了这个,因为我没有在我的根路径('/')上设置权限,但根据这篇文章,这不是问题。
我尝试将我的 3 个“写入”规则设置为“真”并且它有效,所以我想问题一定出在我的规则中。
请看下面我的代码。
角度服务:
let event = {
"title": "Title"
"uid": "FZON4aEQgKNnRlHqMH7ZwynhTtp1"
}
let uid = this.authService.fbUser.uid;
let eventId = this.db.list('eventsData').push(undefined).key;
let updateObject = {};
updateObject[`eventData/${eventId}`] = event;
updateObject[`userEvents/${uid}/${eventId}`] = true;
updateObject[`eventGuests/${eventId}/${uid}`]= {
attendance: 2 // and some other data
};
return this.db.object('/').update(updateObject);
数据层次结构:
{
"eventData" : {
"-KptoNEw3MKRfacLnqa6" : { //Some data equal to 'event' object in above Angular service }
},
"eventGuests" : {
"-KptoNEw3MKRfacLnqa6" : {
"FZON4aEQgKNnRlHqMH7ZwynhTtp1" : { // Some data }
}
},
"userEvents" : {
"FZON4aEQgKNnRlHqMH7ZwynhTtp1" : {
"-KptoNEw3MKRfacLnqa6" : true
}
},
"users" : {
"FZON4aEQgKNnRlHqMH7ZwynhTtp1" : { //Some data }
}
}
Firebase 规则:(我删除了“.read”权限以使代码更清晰,因为它们不是问题的一部分)
{
"rules": {
"eventData": {
"$eventId": {
// Event owner can update data
// OLD > ".write": "auth.uid == data.child('uid').val()"
// NEW
".write": "(newData.child('uid').val() == auth.uid) && (!data.exists() || data.child('uid').val() == auth.uid)"
}
},
"eventGuests": {
"$eventId": {
"$uid": {
// Event owner can add someone to the event
// Actual user can modify his attendance
".write": "(auth.uid == root.child('eventData').child($eventId).child('uid').val() ) || (auth.uid == $uid && data.exists() && newData.exists())"
}
}
},
"userEvents": {
"$uid": {
"$eventId": {
// Event owner can add his event to someone's list
".write": "auth.uid == root.child('eventData').child($eventId).child('uid').val()"
}
}
}
}
}
感谢您的观看!
更新:
自从 Frank 更正了一个错误后,我进行了一些新的测试。
我不是以多路径方式进行更新,而是通过评论我不想运行的那些方式来进行更新。此外,我尝试使用静态值。
let updateObject = {};
updateObject[`eventData/-Kpu9op4_s3jCetav6xn`]= {
"title": "Title"
"uid": "FZON4aEQgKNnRlHqMH7ZwynhTtp1"
};
return this.db.object('/').update(updateObject);
然后:
let updateObject = {};
updateObject[`userEvents/${uid}/-Kpu9op4_s3jCetav6xn`]= true;
return this.db.object('/').update(updateObject);
还有:
let updateObject = {};
updateObject[`eventGuests/-Kpu9op4_s3jCetav6xn/${this.authService.fbUser.uid}`]= {
attendance: 2 // and some other data
};
return this.db.object('/').update(updateObject);
他们三个工作。
但是当我使用多路径(同时3个)运行代码时,我仍然得到权限被拒绝的错误。
【问题讨论】:
-
为什么每个孩子周围都有数组括号:
[`eventData/${key}`]? -
另请注意,我们不知道
event是什么。请确保您的问题包含minimal, complete code that is needed to reproduce the problem。确保这一点的一种简单方法是对所有内容使用硬编码值。 -
关于括号,它是我使用外部对象时的残余物(myUpdateObject[
eventData/${key}]=myData)。让我更新一下! -
我在下面写了第一个错误。但是这些规则中确实发生了太多事情,这使得很难看到问题所在。看看我之前分享的链接,它解释了如何最小化所需的代码。
标签: firebase firebase-realtime-database firebase-security angularfire2