2017-10-21 1 views
0

Also in Echtzeit DB, ich könnte prüfen, ob neue Daten in verschiedenen Pfaden über newData().parent().parent()...parent() in den Sicherheitsregeln geschrieben werden, wenn ich Fanout schreibe.Wie wird nach neuen Dokumenten in einer anderen Sammlung nach Sicherheitsregeln gesucht?

z.B.

const fanout = { 
    'users/user_a': { 
    username: 'foobar' 
    }, 

    'usernames': { 
    'foobar': 'user_a' 
    } 
}; 

firebase.update(fanout); 

Und eine Sicherheit etwas wie folgt aus:

"rules": { 
    "users": { 
    $user_id: { 
     "username": { 
     ".validate": "newData.parent().parent().parent().child('usernames').child(newData.val()).val() == auth.uid; 
     } 
    } 
    }, 

    "usernames": { 
    "$username": { 
     ".validate": "newData.parent().parent().child('users').child(auth.uid).child('username').val() == $username" 
    } 
    } 
} 

Wenn mich gefragt, ob es einen Weg gibt diese Sicherheitsregeln des in Firestore zu tun? Ich habe die exists() Funktion gesehen, aber es ist nur für die vorhandenen Dokumente, nicht etwas, das geschrieben wird.

Antwort

0

Leider gibt es derzeit keine entsprechende Fähigkeit in Cloud Firestore Rules. Sie können request.resource.data verwenden, um die Daten zu untersuchen, die in einer Anfrage geschrieben werden, aber ein Stapelschreibvorgang wird als separate Anforderungen in Rules behandelt und es gibt keine Möglichkeit, den Nettoeffekt aller Schreibvorgänge wie newData in der Echtzeitdatenbank zu untersuchen. Wir werden dies in Zukunft jedoch zu Cloud Firestore hinzufügen.

Wenn es hilfreich ist, könnte dieser spezielle Anwendungsfall vielleicht ohne Fanout gelöst werden, da Sie eine usersRef.where('username', '==' 'foobar').get() Abfrage ausführen können, um den Benutzer mit einem bestimmten Benutzernamen zu erhalten.

+0

Ich möchte vermeiden, dass 2 separate Transaktionen zum Speichern von Benutzer und Benutzername möglicherweise Datenqualitätsprobleme verursachen können (z. B. was passiert, wenn die zweite Transaktion nie gespeichert wird, weil der Benutzer plötzlich Internet verliert oder die App schließt). 90% meiner Schreibvorgänge sind aus genau diesen Gründen Stapel. Als Workaround leben all diese Texte in Cloud Functions, was für mich nicht ideal ist. Ich hoffe, diese Funktion landet bald in Cloud Firestore! Vielen Dank! – rmmmp

+0

Sorry, ich habe es wirklich schlecht erklärt. Ich wollte damit sagen, dass man Fanout vermeiden kann, indem man die "usernames" -Kollektion loswird und nur "Benutzer" direkt abfragt, so dass man nicht an zwei verschiedene Orte schreiben und 2 Transaktionen verwenden muss. –

+0

Aber wie stelle ich sicher, dass Benutzernamen pro Benutzer eindeutig sein sollten? Ich plane nicht, es als Schlüssel zu machen, da wir Benutzernamen veränderbar machen wollen. – rmmmp

Verwandte Themen