如何正确设置Firestore安全规则

时间:2017-11-09 13:41:15

标签: firebase firebase-security google-cloud-firestore

虽然看起来很简单,但我仍然在努力设置一些基本的Firestore规则,这些规则没有按预期工作。

对于下面发布的方案和查询,使用此数据库:

Database Screen

情景1

无法确定数据库名称?我认为它是restaurants,但有了这个假设,下面的代码不起作用,并且获得PERMISSION_DENIED例外:

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

场景2

收集餐馆有10个文件,如上面的屏幕所示,我已经硬编码了10个,并允许他们如下所述进行读写,但它不起作用,并得到相同的PERMISSION_DENIED例外:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {

     allow read : if document in ['2uFMIc2BSH6oslxEABpB','8GMNVxVUb1HzRAk2QmmX',
      'AryyMURod8AeWAfBVavF','AvnpKGMeUWDSfowFLpwa','H0qi7gI8WmSVobu19G49',
      'H2xhfoj0Rn75BH9nnbuI','NRfgppqWRfj3DtHDlft4','R9gZ0hTxCPXwSeV2prNV',
      'YgXXwndeIfZx6rUhdlc4','v22FlL7LBBY851N8sIvQ'] ;

      allow write : if document in ['2uFMIc2BSH6oslxEABpB','8GMNVxVUb1HzRAk2QmmX',
      'AryyMURod8AeWAfBVavF','AvnpKGMeUWDSfowFLpwa','H0qi7gI8WmSVobu19G49',
      'H2xhfoj0Rn75BH9nnbuI','NRfgppqWRfj3DtHDlft4','R9gZ0hTxCPXwSeV2prNV',
      'YgXXwndeIfZx6rUhdlc4','v22FlL7LBBY851N8sIvQ'] ;


    }
  }
}

这两个可能不是非常实用的场景,但更多的是我的理解。

1 个答案:

答案 0 :(得分:1)

  1. 在您的第一个示例中,database是数据库的名称,可能类似于“(默认)”。

  2. 在您的第二个示例中,document将成为您文档的完整路径;那是=**通配符所做的 - 它是“我路径中的其他所有东西”的通配符。所以它等于restaurants/2uFMIc2BSH6oslxEABpB

  3. 之类的东西

    如果您想创建一条规则,“用户可以阅读我的餐馆集合中的任何文档”,您需要这样的内容:

    service cloud.firestore {
      match /databases/{database}/documents {
        match /restaurants/{restaurantID} {
          allow read, write: if true;
        }
      }
    }
    

    如果您想对各个餐厅的文档ID做一些有趣的事情,您可能想要做更多这样的事情:

    service cloud.firestore {
      match /databases/{database}/documents {
        match /restaurants/{restaurantID} {
          allow read, write: if restaurantID == '2uFMIc2BSH6oslxEABpB; ;
        }
      }
    }