Firebase 如何正确设置Firestore安全规则

Firebase 如何正确设置Firestore安全规则,firebase,firebase-security,google-cloud-firestore,Firebase,Firebase Security,Google Cloud Firestore,虽然看起来很简单,但我仍在努力设置一些基本的Firestore规则,这些规则并没有如预期的那样工作 对于以下发布的场景和查询,使用此数据库: 情景1 我无法找出数据库名称?我以为这是餐厅,但基于此假设,下面的代码不起作用,并且获得权限被拒绝异常: service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if da

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

对于以下发布的场景和查询,使用此数据库:

情景1

我无法找出数据库名称?我以为这是
餐厅
,但基于此假设,下面的代码不起作用,并且获得
权限被拒绝
异常:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if database == "restaurants";
    }
  }
}
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'] ;


    }
  }
}
场景2

收集餐厅有10个文档,如上图所示,我已硬编码了这10个文档,并允许它们按如下方式读写,但它不起作用,并且获得相同的
权限\u被拒绝
异常:

service cloud.firestore {
  match /databases/{database}/documents {
    match /{document=**} {
      allow read, write: if database == "restaurants";
    }
  }
}
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'] ;


    }
  }
}
这两个场景可能不是很实际,但更多是为了我的理解

  • 在第一个示例中,
    database
    是数据库的名称,可能类似于“(default)”

  • 在第二个示例中,
    document
    将是文档的完整路径;这就是通配符的作用——它是一种“我路径中的所有其他内容”的通配符。因此,它将相当于
    餐厅/2uFMIc2BSH6oslxEABpB

  • 如果要创建一条规则,说明“用户可以阅读我的餐厅收藏中的任何文档”,则需要如下内容:

    service cloud.firestore {
      match /databases/{database}/documents {
        match /restaurants/{restaurantID} {
          allow read, write: if true;
        }
      }
    }
    
    service cloud.firestore {
      match /databases/{database}/documents {
        match /restaurants/{restaurantID} {
          allow read, write: if restaurantID == '2uFMIc2BSH6oslxEABpB; ;
        }
      }
    }
    
    如果您想使用您个人餐厅的文档ID做一些有趣的事情,您可能想做一些更像这样的事情:

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