存储用户数据展平安全性

时间:2016-04-28 14:33:43

标签: firebase angularfire firebase-security firebase-realtime-database

我想创建一个拥有大量用户数据的应用。让我们说每个用户跟踪他们自己的每个任务的时间。如果我将它存放为扁平形状,它将如下所示:

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

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

1 个答案:

答案 0 :(得分:2)

您已经读过安全规则不能用于过滤数据。即使是创意数据建模也无法改变这一点。 : - )

为了正确保护对您的任务的访问权限,您需要以下内容:

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

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

但是根据这些规则,您的查询无法正常运行。在它最核心的地方,您的查询是从tasks处读取:

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

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

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