2017-10-13 2 views
0

ich meine, ich weiß, was diese sind, aber ich bin ein wenig über die Sicherheitsregeln, zum Beispiel verwirren:Firestore-Regeln, was ist eine Sammlung und ein Dokument?

service cloud.firestore { 
    match /databases/{database}/documents { 
    // This is probably a mistake 
    match /spaceships { // <= what is this a collection or a document? 
     allow read; 
     // In spite of the above line, a user can't read any document within the 
     // spaceship collection. 
    } 
    } 
} 

Firebase Dokumentation sagt:

Regeln für die Sammlungen gelten nicht für Dokumente innerhalb diese Sammlung. Es ist ungewöhnlich (und wahrscheinlich ein Fehler), eine Sicherheitsregel zu haben, die auf der Sammlungsebene statt auf der Dokumentebene geschrieben ist.

Das bedeutet, dass diese match /spaceships {... eine Sammlung richtig ist?

Aber später haben wir diese:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /{document=**}{ // <= what is this a document or a collection? 
     allow read, write: if true; 
    } 
    } 
} 

Ich verstehe nicht, ist dies match /{document=**}{... ein Dokument? oder eine Sammlung? Ich meine, ist auf der Sammlungsebene.

Antwort

1

Paths in Firestor sind abwechselnd Sammlungen und Dokumente: /collection/document/subcollection/subdocument

Zum Beispiel:

// Matches kaylee, the mechanic on serenity 
/spaceships/serenity/crew/kaylee/... 

Wenn Sicherheitsregeln verwenden, können Sie Platzhalter angeben:

// This will match any spaceship, and any crewmember 
/spaceships/{spaceshipId}/crew/{crewmemberId}/... 

Nun stell dir vor, dass Sie eine weitere Unterkollektion unter spaceships:

/spaceships/{spaceshipId}/stowaways/{stowawayId}/... 

Wenn Sie Regeln gegen mehrere Subkollektionen schreiben möchten, müssen Sie entweder:

// You could use multiple single wildcards 
/spaceships/{spaceshipId}/{crewOrStowaway}/{crewOrStowawayId}/... 

// Or you could use a multi-segment wildcard 
/spaceships/{spaceshipId}/{allShipInformation=**} 

Dies gibt allShipInformation als Pfad, der alle Dokumente und Sammlungen an und unter diesem Pfad übereinstimmen. Beachten Sie, dass es sich um ein oder mehrere Pfadsegmente handelt und nicht um null oder mehr.

Sie können mehr über diese in the docs

0

In Ihrem ersten Beispiel lesen /spaceships ist auf der Sammlungsebene. Wie in dem Zitat, auf das Sie verwiesen haben, angegeben wurde, ist das Platzieren einer Regel hier nicht hilfreich, da sie auf keines der Dokumente in der Sammlung angewendet wird.

In Ihrem zweiten Beispiel befindet sich /{document=**} auf der Sammlungsstufe, verwendet aber eine recursive wildcard. Kurz gesagt, was dies bewirkt, wendet die Regel auf die Dokumente innerhalb dieser Sammlung und auf alle Dokumente innerhalb jeder Untersammlung dieser Sammlung an.

Auf diese Weise können Sie schreiben:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /{document=**}{ 
     allow read, write: if true; 
    } 
    } 
} 

Statt:

service cloud.firestore { 
    match /databases/{database}/documents { 
    match /spaceships/{shipId} { 
     allow read, write: if true; 
    } 
    match /spaceships/{shipId}/crew/{crewMemberId} { 
     allow read, write: if true; 
    } 
    } 
} 
Verwandte Themen