存储用户数据扁平化安全

Storing User Data Flattened Security

我想创建一个包含大量用户数据的应用程序。假设每个用户跟踪他们自己的每项任务时间。如果我把它压平存放,它会是这样的:

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

我应该这样构建它吗?我的查询有效,但我不确定一旦我引入一个用户无法看到另一个用户任务的安全性后它是否会起作用。

您已经了解到安全规则不能用于过滤数据。甚至创造性数据建模也无法改变这一点。 :-)

要正确保护对您的任务的访问,您需要类似以下内容:

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

每个用户只能阅读自己的任务。

但是使用这些规则,您的查询将不起作用。最核心的是,您的查询是从 tasks 此处读取的:

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

并且由于您的用户没有 tasks 的读取权限,因此读取操作失败。

如果您授予用户对 tasks 的读取权限,读取和查询将起作用,但用户随后也可以读取您不想授予他们访问权限的所有任务。