让用户访问自己在 firebase 中的数据

Let user access to their own data in firebase

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

规则定义如下-

{
  "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;
}

错误:

ERROR Error: permission_denied at /expenses: Client doesn't have permission to access the desired data.

您似乎正在尝试从 /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
}