2017-05-13 1 views
1

Aus irgendeinem Grund löst die folgende Sicherheitsregel zu false auf, wenn ich versuche, ein Objekt ohne die Eigenschaft zu schreiben, die in .hasChild(newData.child('ownerId').val()) verifiziert werden sollte. Die Eigenschaft ist nicht obligatorisch, also bin ich bereit, einen Schreibvorgang ohne sie zu akzeptieren.Sicherheitsregel "hasChild() || true" Auflösung zu false?

"pizza": { 
    "$pizzaId": { 
     ".write": "root.child('users').hasChild(newData.child('ownerId').val()) || true" 
    } 
} 

So erhalte ich eine PERMISSION_DENIED wenn unten etwas wie der Code ausgeführt wird:

firebase.database().ref(`pizza/peperoneID`).set({ 
    extraPepe: true 
}); 

Ich weiß, dass ich es nur geht mit (newData.child('ownerId').exists() && .hasChild(...)) || true beheben können, aber ich versuche wirklich zu verstehen, Warum ist die erste Option nicht genug?

Antwort

1

Wenn es keine ownerId gibt, werden Sie null passieren, wenn Sie hasChild anrufen.

Das wird einen Fehler verursachen und dieser Fehler wird Ihre Regel fehlschlagen sehen - so ist die nachfolgende || true unwirksam.

+0

Danke für die Antwort cartant! Ich nahm an, aber warum konnten wir nicht das 'hasChild() 'in dieser Situation' false' zurückgeben? Zumindest eine bessere Fehlermeldung, anstatt nur zu sagen, dass meine ".write" -Anweisung false zurückgegeben hat. :/Firebase sec Regeln ist nicht die trivialsten Sachen und die Logik neigt dazu, riesig zu werden, wenn man der Anwendung Komplexität hinzufügt ... und mit dieser Vorprüfung fertig zu werden, macht es nur noch schlimmer. – adolfosrs

+0

Denn so wird es eben umgesetzt. Weil ['hasChild'] (https://firebase.google.com/docs/reference/security/database/#haschildchildpath) eine Zeichenfolge verwendet und Sie eine 'null' übergeben. Es ist sinnvoller, den Zugriff zu verweigern, wenn ein Fehler auftritt, als den Zugriff zu gewähren. Weil es besser ist, dem Client eine unspezifische Fehlermeldung zu präsentieren. Und weil du deine Regeln testen solltest - wie du es getan hast oder tust. – cartant

Verwandte Themen