2017-01-25 3 views
12

Ich habe zwei Ember-Modelle: a items und comments. Der Benutzer wird einen Artikel veröffentlichen und andere Benutzer können die Artikel kommentieren.Firebase Sicherheitsregeln Emberfire Mehrere Zugriffsebenen pro Knoten

Ich kann nicht Setup-Sicherheitsregeln innerhalb Feuerbasis, die name und description erlauben nur den aktuellen Benutzer beschreibbar zu sein, sondern ermöglichen comments durch alle angemeldeten Benutzer geschrieben werden.

Artikel

// 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') 
}) 

Kommentar

// 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') 
}) 

Speichern Kommentar

// 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()]); 

Das alles funktioniert gut. Heute habe ich Sicherheitsregeln in Firebase hinzugefügt. Ich möchte nur, dass der aktuell angemeldete Benutzer in der Lage ist, ein Objekt zu bearbeiten, aber jedem anderen Benutzer erlauben, einem Element einen Kommentar hinzuzufügen.

"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" 
     } 
    } 
}, 

Im Firebase-Simulator funktioniert das. Als der Benutzer, der das Element besitzt, kann ich /items/<item_id>/description schreiben. Als ein Benutzer, der das Element nicht besitzt, kann ich /items/<item_id>/comments/, aber nicht zu /items/<item_it>/description schreiben. Es schlägt jedoch innerhalb von Ember mit Emberfire fehl.

Meine Arbeit Theorie ist, dass, wenn ich einen neuen Kommentar zu einem Element hinzufügen, die ich nicht "besitze", dann rufe ich item.save() Emberfire versucht zu schreiben /items/<item_id>.

Wie kann ich Setup Firebase Sicherheitsregeln, so dass nur der Benutzer, der die item besitzt die meisten seiner Eigenschaften aktualisieren kann, aber jeder Benutzer ein comment

hinzufügen Hier ist in der Feuerbasis Regeln Simulator:

Versuch, /items/<item_id>/comments mit einem Benutzer zu schreiben, die nicht diesen Artikel Artikel nicht besitzen, mit Daten

{ 
    "cde": "comment_id" 
} 

wird successf schreibe mit den obigen Regeln. Jedoch

,

Versuch, /items/<item_id> mit einem Benutzer zu schreiben, die nicht diesen Artikel Artikel nicht besitzen, mit Daten

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

ausfällt.

Antwort

1

Das Problem ist, dass in der Regel .write Sie die data verwendet haben predefined variable und data bezieht sich auf:

A RuleDataSnapshot die Daten repräsentieren, wie es existierte, bevor die versuchte Operation.

Für neue Artikel wird data.exists()false sein. Damit die Benutzer, um neue Elemente zu schreiben, sollten Sie newData, statt:

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

Und wenn Sie für das Löschen von Elementen zulassen möchten, sollten Sie für die Existenz von newData testen und verwenden data wenn es nicht der Fall ist existieren:

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

, die auf neue Daten ein guter Punkt, aber es mein Problem nicht lösen. Ich habe den ursprünglichen Beitrag mit weiteren Informationen aus dem Firebase-Simulator aktualisiert. Ich denke, das zeigt, dass Emberfire nach/items schreibt, wenn ich versuche, einen Kommentar zu speichern. –

Verwandte Themen