【问题标题】:Storing User Data Flattened Security存储用户数据扁平化安全
【发布时间】:2016-04-28 23:05:58
【问题描述】:

我想创建一个包含大量用户数据的应用。假设每个用户跟踪每个任务自己的时间。如果我将它展平存储,它将如下所示:

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

我应该这样构建它吗?我的查询有效,但我不确定在一个用户无法看到其他用户任务的情况下引入安全性后它是否有效。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

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

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

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

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

    【讨论】:

    • 这就是我害怕的!有没有解决的办法?您对如何构建数据有什么建议吗?我唯一能想到的就是隐藏每个用户下的所有内容。 p.s.感谢您的快速回复:)
    • 您的初始数据结构为每个用户都有一个索引,该索引列举了他们有权访问的任务。这样你就不需要查询了,你可以ref.child('users').child(authData.uid).child('tasks').on(...
    • 对,但我如何获取所有任务数据?这会让我知道什么是正确的?
    • 不是速度,而是数据量。根据我对 firebase.util 的理解,当您进行这样的连接时,它会获取所有数据,然后在客户端过滤它?如果那不是真的,那么这就是我的错误所在。这也意味着人们可以访问任务的所有数据,但只是不知道它与哪个用户相关联,对吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2012-02-01
    • 2017-04-17
    相关资源
    最近更新 更多