0

我想创建一个有很多用户数据的应用程序。假设每个用户都跟踪他们自己的每个任务的时间。如果我将它平放它看起来像这样:存储用户数据Flattenned安全

{ 
    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它说(接近尾声)“...直到我们进入成千上万的记录...”,然后没有解释如何处理。

所以我的问题如下。我知道我们无法通过安全进行筛选,但是我可以使用安全性限制用户访问的内容,然后在搜索时将其从用户标识中删除?然后我的结构会变成这样:

{ 
    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 
     }, 
     ... 
    } 
} 

然后我会成立我的安全规则,只允许每个任务由谁创造了它的用户进行访问,我的裁判查询应该是这样的:

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')); 

这是我该如何构造它?我的查询有效,但我不确定一旦我引入安全性,一个用户无法看到其他用户任务时它是否会工作。

回答

2

您已经阅读过安全规则不能用于过滤数据。甚至连创意数据建模都无法改变这一点。 :-)

要正确给您的任务安全地访问你需要这样的东西:

"tasks": { 
    "$taskid": { 
    ".read": "auth.uid === data.child(user).val()" 
    } 
} 

有了这个每个用户只能读取自己的任务。

但有了这些规则,您的查询将无法正常工作。在它的最核心的查询从tasks这里阅读:

ref.child('tasks/')...some-filtering...on(... 

而且,由于用户不具有读取权限tasks该读操作失败。

如果您要为用户提供tasks的读取权限,则读取和查询可以正常工作,但用户还可以读取您不希望授予其访问权限的所有任务。

+0

这就是我害怕的!有没有解决的办法?你有关于如何构建数据的建议吗?我能想到的唯一事情就是隐藏每个用户的所有内容。附:感谢您的快速响应:) –

+1

您的初始数据结构为每个用户列出了他们有权访问的任务的索引。因此,你不需要查询,你可以'ref.child('users')。child(authData.uid).child('tasks')。on(...'。 –

+0

对,但是我怎么做得到所有的任务数据?这将让我知道什么是正确的ID? –