我一直在尝试将规则添加到我的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人工作。
但是当我使用多路径(同时3个)运行代码时,我仍然会收到权限被拒绝错误。
答案 0 :(得分:1)
/eventData/$event
中出现了第一个错误:
".write": "auth.uid == data.child('uid').val()"
由于data
是该位置的现有数据,因此我很确定当没有现有数据时此规则将失败。
你想要的可能性更大:
(newData.child('uid').val() == auth.uid) &&
(!data.exists() || data.child('uid').val() == auth.uid)
答案 1 :(得分:0)
我进行了最后一次测试以证实我的意思。
这是我的规则在之前失败时的样子:
eventGuests :如果当前用户是事件的所有者,或者当前用户是被修改的用户,则写入
“。write”:“(auth.uid == root.child('eventData')。child($ eventId).child('uid')。val())||(auth.uid == $ uid&& data.exists()&& newData.exists())“
userEvents :如果当前用户是事件的所有者,则写入
“。write”:“auth.uid == root.child('eventData')。child($ eventId).child('uid')。val()”
现在,如果我使用以下代码,那就有效:
(!root.child('eventData')。child($ eventId).exists()|| auth.uid == root.child('eventData')。child($ eventId ).child(为 'uid')。VAL())
在交易结束之前,似乎无法访问交易中的数据。
按照这个确切的顺序调用以下内容......
public Recipes()
{
disciplines = new List<string>();
ingredients = new HashSet<Ingredient>();
}
.../...
// [ForeignKey("Items")] remove this
[ForeignKey("Ingredient")]
public Ingredient Ingredient // include as Ingredient object
// the PK of the Ingredient is the FK for the Recipe
.../...
public virtual ICollection<Ingredient> Ingredients { get; set; }
// The Recipe does not have an Item, the Ingredient has
// has a collection of <Item> Items
// public virtual Items Items { get; set; }
...我希望 eventData 能够持久存储,并且可以在 userEvents 和 eventGuests 中访问。然后,如果发生错误,系统将回滚。但看起来它并没有那样工作。
任何人都可以确认在事务验证之前无法访问事务中的推送数据吗?