我想创建一个拥有大量用户数据的应用。让我们说每个用户跟踪他们自己的每个任务的时间。如果我将它存放为扁平形状,它将如下所示:
{
users: {
USER_ID_1: {
name: 'Mat',
tasks: {
TASK_ID_1: true,
TASK_ID_2: true,
...
}
},
},
tasks: {
TASK_ID_1: {
start: 0,
end: 1
},
TASK_ID_2: {
start: 1,
end: 2
}
}
}
现在我想查询并获取用户的所有任务信息。现在数据很小。从他们的向导:https://www.firebase.com/docs/web/guide/structuring-data.html它说(接近结束)" ...直到我们进入成千上万的记录......"然后没有解释如何处理。
所以我的问题如下。我知道我们无法通过安全性进行过滤,但是我可以使用安全性来限制人们访问的内容,然后在搜索时将其从用户ID中删除吗?我的结构将转向:
{
users: {
USER_ID_1: {
name: 'Mat'
}
},
tasks: {
TASK_ID_1: {
user: USER_ID_1,
start: 0,
end: 1
},
TASK_ID_2: {
user: USER_ID_1,
start: 1,
end: 2
},
...
}
}
然后我会设置我的安全规则,只允许创建它的用户访问每个任务,我的ref查询将如下所示:
var ref = new Firebase("https://MY_FIREBASE.firebaseio.com/");
$scope.tasks = $firebaseArray(ref.child('tasks/')
.orderByChild('user')
.startAt('USER_ID_1')
.endAt('USER_ID_1'));
我应该如何构建它?我的查询有效,但我不确定一旦我引入安全性,一个用户无法看到其他用户任务,它是否能正常工作。
答案 0 :(得分:2)
您已经读过安全规则不能用于过滤数据。即使是创意数据建模也无法改变这一点。 : - )
为了正确保护对您的任务的访问权限,您需要以下内容:
"tasks": {
"$taskid": {
".read": "auth.uid === data.child(user).val()"
}
}
有了这个,每个用户只能阅读自己的任务。
但是根据这些规则,您的查询无法正常运行。在它最核心的地方,您的查询是从tasks
处读取:
ref.child('tasks/')...some-filtering...on(...
由于您的用户对tasks
没有读取权限,因此此读取操作失败。
如果您授予用户tasks
的读取权限,则读取和查询将起作用,但用户也可以阅读您不希望授予他们访问权限的所有任务。