【问题标题】:Firestore security rules based on request query value基于请求查询值的 Firestore 安全规则
【发布时间】:2018-08-04 07:40:35
【问题描述】:

我正在尝试保护对集合的请求以允许任何单个 get,但仅在匹配特定密钥时才允许 list

数据库结构是这样的:

projects
  project1
    name: "Project 1 name"
    board_id: "board1"
  project2
    name: "Project 2 name"
    board_id: "board2"

boards
  board1
  board2

我从 Vue 进行的 Firestore 查询:

// Only return projects matching the requested board_id

db
  .collection("projects")
  .where("board_id", "==", this.board_id)

我想要的安全规则是这样的:

match /projects/{project} {
  allow get: if true // this works
  allow list: if resource.data.board_id == [** the board_id in the query **]

  // OR

  allow list: if [** the board_id in the query **] != null

我想这样做,以便您可以在特定板上列出项目,但不能只列出所有内容。

有没有办法在安全规则中访问请求的.where(),还是我需要将我的projects 集合嵌套在我的boards 集合中并以这种方式保护它?

【问题讨论】:

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


    【解决方案1】:

    这实际上取决于您将来要如何查询数据。如果您不需要列出所有项目(不考虑板子),那么您当前的数据模型会更好,并且可以通过将允许的板子作为地图 {board_id: true} 或(理想情况下)子集合添加到 /用户文档。

    当前数据模型

    数据库

    /projects/{project_id}
    /boards/{board_id}
    /users/{uid}/boardPermissions/{board_id}
    

    安全规则

    match /projects/{project} {
      allow list: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/boardPermissions/${resource.data.board_id})
    

    替代数据模型

    如果您想对数据进行完全分区(我的许多项目都倾向于这样做),请创建以下模型

    数据库

    /boards/{board_id}/projects/{project_id}
    /users/{uid}/boardPermissions/{board_id}
    

    安全规则

    match /boards/{board_id}/projects/{project_id} {
      allow list: if exists(/databases/$(database)/documents/users/$(request.auth.uid)/boardPermissions/${board_id})
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-03-22
      • 2018-10-01
      • 2021-03-25
      • 2019-06-15
      • 2020-05-23
      • 2021-07-29
      • 2018-11-27
      • 2019-07-23
      相关资源
      最近更新 更多