让用户访问Firebase中自己的数据

时间:2018-07-03 19:29:10

标签: firebase-realtime-database firebase-authentication angularfire2 firebase-security-rules

我有与每个数据相关联的用户

data model pic

和规则定义如下-

{
  "rules": {
    ".read": false,
    ".write": false,
    "expenses": {
      ".read": "auth.uid === data.child('userId').val()",
      ".write": "auth.uid === data.child('userId').val()"
    },
    "categories": {
        ".read": "auth != null",
        ".write": "auth != null"
    }
  }
}

我要求用户只能读取与他们的userId关联的数据。

获取数据的功能-

getExpense():AngularFireList<ExpenseData>{
   if (!this.userId) return;
   this.expenses = this.db.list(`expenses`);
   return this.expenses
}



getCategory():AngularFireList<CategoryData>{
   if (!this.userId) return;
   this.categories = this.db.list('categories');
   return this.categories;
}

错误:

  

错误错误:/ expenss处的权限被拒绝:客户端没有访问所需数据的权限。

1 个答案:

答案 0 :(得分:1)

您似乎正在尝试从/expenses中读取内容,但这是访问/expenses的条件:

".read": "auth.uid === data.child('userId').val()",

由于没有/expenses/userId,因此没有人可以访问/expenses。如果您添加一个具有UID的/expenses/userId,则具有该UID的用户将有权访问所有/expenses,而不仅仅是他们自己。

请注意,安全规则不能用于过滤数据,我认为您正在尝试这样做。以前很多都讨论了这个主题,所以我建议您查看一些questions that mention "rules are not filters"

几个月后,有可能完成您的方案。但是您需要将这两个步骤并行进行:

  1. 确保从代码中仅查询允许的子节点。
  2. 使用您的规则来验证查询是否仅访问允许的数据。

请参见documentation on query-based rules。从那里:

代码:

db.ref("baskets").orderByChild("owner")
                 .equalTo(auth.currentUser.uid)
                 .on("value", cb)     

规则:

"baskets": {
  ".read": "auth.uid != null &&
            query.orderByChild == 'owner' &&
            query.equalTo == auth.uid" // restrict basket access to owner of basket
}