我有一个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身份验证规则就越不可能。我真的希望事实并非如此。
答案 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()"
}
}