我有与每个数据相关联的用户
和规则定义如下-
{
"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处的权限被拒绝:客户端没有访问所需数据的权限。
答案 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"。
几个月后,有可能完成您的方案。但是您需要将这两个步骤并行进行:
请参见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 }