多对多(联接对象)关联的规则

时间:2014-06-19 00:45:41

标签: firebase firebase-security

我有一个Assignment对象,可以将Project“加入”Service。许多User可以在任何给定的Assignment(或项目服务)上工作。

  • User有很多Assignment s
  • Project有很多Assignment s
  • Assignment有很多User s
  • Assignment属于Project a Service

以下是视觉效果的一些示例数据的快照。

users: {
  1: {
    name: 'John Smith',
    assignments: {
      1: true
    }
  },
  2: {
    name: 'Jane Doe',
    assignments: {
      1: true
    }
  }
}
projects: {
  1: {
    title: 'Project #1',
    assignments: {
      1: true
    }
  }
}
services: {
  1: {
    title: 'Service #1'
  }
}
assignments: {
  1: {
    service: 1,
    project: 1,
    users: {
      1: true,
      2: true
    }
  }
}

我正在尝试编写一个安全规则,以便项目只能由分配给它的用户读取。到目前为止,我可以弄清楚如何获取给定的所有分配项目

root.child('assignments')[data.child('assignments')]

当嵌套在"$project"下时,此规则将返回一系列分配。如何检测这些作业的一个是否包含我的用户(auth.id)?

或者我是否以错误的方式思考这个问题?

编辑:我越是想到它并尝试实施此规则,我越相信使用Firebase身份验证规则就越不可能。我真的希望事实并非如此。

1 个答案:

答案 0 :(得分:1)

目前没有办法搜索匹配规则的所有子项。这里一个简单的答案是通过在每个用户下面放置一个有效项目列表(就像你完成了分配一样)或者通过维护一个单独的列表来将用户索引到项目中:

/users/$userid/projects/$projectid/true
/project_assignments/$userid/$projectid/true

其中任何一个都允许您编写有问题的安全规则:

"projects": {
   "$projectid": {
      ".read": "root.child('users/'+auth.uid+'/projects/'+$projectid).exists()"
      // or
      ".read": "root.child('project_assignments/'+auth.uid+'/'+$projectid).exists()"
   }
}