Firestore规则,什么是集合和文档?

时间:2017-10-13 16:59:20

标签: firebase-security google-cloud-firestore

我的意思是我知道那些是什么,但我对安全规则有点混淆,例如:

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文档说:

  

集合规则不适用于该集合中的文档。拥有一个在集合级别而不是文档级别编写的安全规则是不寻常的(也可能是错误的)。

这意味着这个match /spaceships {...是一个集合吗?

但是后来我们有了这个:

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

我不明白这个match /{document=**}{...是一份文件吗?还是收藏品?我的意思是收集级别。

2 个答案:

答案 0 :(得分:1)

Firestore中的路径是交替的集合和文档:/collection/document/subcollection/subdocument

例如:

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

使用安全规则时,您可以指定通配符:

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

现在假设您在spaceships下有另一个子集合:

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

如果要针对多个子集合编写规则,则需要:

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

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

这将返回allShipInformation作为路径,该路径将匹配该路径及其下方的所有文档集合。请注意,它是一个或多个路径段,而不是零或更多。

您可以阅读有关此in the docs

的更多信息

答案 1 :(得分:0)

在您的第一个示例中,/spaceships位于收集级别。正如您引用的引用中所述,在此处放置规则没有帮助,因为它不会应用于集合中的任何文档。

在您的第二个示例中,/{document=**}位于集合级别,但使用的是recursive wildcard。简而言之,这样做是将规则应用于此集合中的文档以及此集合的任何子集合中的任何文档。

这允许你写:

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

而不是:

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;
    }
  }
}