用于保护帐户的Firebase Firestore规则

时间:2018-04-30 16:23:51

标签: firebase google-cloud-firestore

我正在研究我的第一个大型火山基地火灾风暴应用程序。它本质上是一个多租户应用程序,我们有一个集合结构,如:

  • accounts /
  • 账户/ {帐户ID} / otherCollections

帐户文档如下所示:

{
 "name": "ACME Inc",
 "primaryUserID": "2wUMSpffuQgcFDWWI9uHm9RY642",
 "users": {
 "2wUMSpffuQgcFDWWI9uHm9RY642": {
    "admin": true,
    "user": true
  }
 }
}

我希望确保帐户列表仅显示用户有权查看的帐户。我也想保护子集合。到目前为止,我已经制定了以下规则:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
     allow read, write: if request.auth.uid != null;
    }    
    match /accounts/{account}{
      function signedIn() {
        return request.auth.uid != null;
      }
      function SignedInAndBelongsToAccount() {
        return signedIn() && getUser() != null;
      }
      function getRole(roleName){
        return getUser()[roleName] == true;
      }
      function getUser() {
        return get(/databases/$(database)/documents/accounts/$(account.uid)).data.users[request.auth.uid];
      }
     allow read: if getRole('user')
     allow write: if getRole('admin');
  }
 }
}

但我的列表显示所有帐户,我还没有想出子集合。我错过了什么?它不会过滤行,而是需要在应用查询中过滤它吗?或者我应该将其结构完全不同?

1 个答案:

答案 0 :(得分:0)

您的第一条规则与集合而非文档相匹配,documentation中特别建议您这样做:

  

所有匹配语句都应指向文档,而不是集合。

我认为同样的规则是允许您列出所有文档/集合的原因。尝试删除它并查看