1

我一直在试图规则添加到我的火力地堡数据库几天,但一个错误不断坡平,我找不到什么是错的。火力地堡多路径更新 - 权限被拒绝

有错误:

火力警告: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 } 
    } 
} 

火力地堡规则:(我删除'.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()" 
     } 
     } 
    } 
    } 
} 

感谢您的参观!

UPDATE:

由于弗兰克的错误的纠正,我进行了一些新的考验。

我所做的更新并不多路径方式,但一个接一个,通过评论那些我不想跑。另外,我尝试了静态值。

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

为什么你身边每个子阵列括号:''['EVENTDATA/$ {}键']''? –

+0

另请注意,我们不知道“事件”是什么。请确保您的问题包含了[是需要重现该问题最小的,完整的代码(http://stackoverflow.com/help/mcve)。确保这一点的一个简单方法是对所有内容使用硬编码值。 –

+0

关于支架,它是由当我用外部物体的残余(myUpdateObject ['EVENTDATA/$ {键}'] = MYDATA的)。让我更新所有的! –

回答

0

我跑了最后一次测试,以证实我虽然。

这是我的规则怎么看起来像当它前面失败:

eventGuests:如果当前用户是事件的所有者或者如果当前用户是正在修改的一个

”编写。写 “:”(。auth.uid == root.child( 'EVENTDATA')孩子($事件ID).child( 'UID')VAL())||(auth.uid == $ UID & &数据。存在()& & newData.exists())”

userEvents:写,如果当前用户是事件的所有者

“.WRITE”:“auth.uid == root.child( 'EVENTDATA')孩子($事件ID).child( 'UID' ).VAL()”

现在,如果我改用以下,即工作:

root.child( 'EVENTDATA'!)孩子($事件ID).exists(。 )|| auth.uid == root.child( 'EVENTDATA')。子女($事件ID).child( 'UID')。VAL())

好像从交易数据不是之前访问交易结束。

通过调用这个确切顺序如下......

let updateObject = {}; 
updateObject[`eventData/${eventId}`] = event; 
updateObject[`userEvents/${uid}/${eventId}`] = true; 
updateObject[`eventGuests/${eventId}/${uid}`]= { 
    attendance: 2 // and some other data 
}; 

...我期待EVENTDATA要坚持和userEventseventGuests来访问。然后如果发生错误,系统会回滚。但它看起来不是那样工作的。

还可以继续交易验证人确认推一个事务中的数据不可访问?

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) 
+0

你说得对。这是问题的一部分,但最后我仍然得到同样的错误。我会用我运行的几个新测试和结果更新我的答案。 –