J'ai essayé d'ajouter des règles à ma base de données Firebase pendant quelques jours, mais une erreur persiste et je ne trouve pas ce qui ne va pas.Firebase multi-path update - Autorisation refusée
Il est l'erreur:
Firebase AVERTISSEMENT: mise à jour à/a échoué: PERMISSION_DENIED
PERMISSION_DENIED: Autorisation refusée
J'ai cherché des solutions et a trouvé un certain poste lié (Permission denied error during multiple update on Firebase) . Il semble que l'erreur affichée ne soit pas correcte. Je pensais que je l'avais parce que je n'avais aucun droit défini sur mon chemin racine ('/'), mais selon ce post, ce n'est pas un problème.
J'ai essayé de définir mes 3 règles 'write' sur 'true' et cela fonctionne, donc je suppose que le problème doit être dans mes règles.
Voir ci-dessous mon code.
Service angulaire:
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);
La hiérarchie des données:
{
"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 }
}
}
règles Firebase: (j'ai enlevé '.Lire' droits pour rendre le code plus propre car ils ne sont pas une partie du problème)
{
"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()"
}
}
}
}
}
Merci d'avoir regardé!
MISE À JOUR:
Depuis la correction d'un bug par Frank, j'ai couru quelques nouveaux tests.
J'ai fait la mise à jour non multi-chemin, mais un par un, en commentant ceux que je ne voulais pas exécuter. En outre, j'ai essayé avec des valeurs statiques.
let updateObject = {};
updateObject[`eventData/-Kpu9op4_s3jCetav6xn`]= {
"title": "Title"
"uid": "FZON4aEQgKNnRlHqMH7ZwynhTtp1"
};
return this.db.object('/').update(updateObject);
Puis:
let updateObject = {};
updateObject[`userEvents/${uid}/-Kpu9op4_s3jCetav6xn`]= true;
return this.db.object('/').update(updateObject);
Et:
let updateObject = {};
updateObject[`eventGuests/-Kpu9op4_s3jCetav6xn/${this.authService.fbUser.uid}`]= {
attendance: 2 // and some other data
};
return this.db.object('/').update(updateObject);
Les trois d'entre eux travaillaient. Mais quand j'exécute le code en utilisant multi-path (3 en même temps), j'obtiens toujours l'erreur d'autorisation refusée.
Pourquoi avez-vous des parenthèses de tableau autour de chaque enfant: '' ['eventData/$ {key}'] ''? –
Notez également que nous n'avons aucune idée de ce qu'est 'event'. Assurez-vous que votre question contient le [code minimal et complet requis pour reproduire le problème] (http://stackoverflow.com/help/mcve). Un moyen facile d'assurer cela est d'utiliser des valeurs codées en dur pour tout. –
A propos des parenthèses, il s'agit d'un reste de quand j'ai utilisé un objet externe (myUpdateObject ['eventData/$ {key}'] = myData). Laissez-moi mettre à jour tout ça! –