让用户访问自己在 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"。
几个月后, 有可能完成您的方案。但是您需要同时执行两个步骤:
- 从您的代码中确保只查询允许的子节点。
- 使用您的规则验证查询是否仅访问允许的数据。
见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
}
我有与每个数据关联的用户,
规则定义如下-
{
"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"。
几个月后, 有可能完成您的方案。但是您需要同时执行两个步骤:
- 从您的代码中确保只查询允许的子节点。
- 使用您的规则验证查询是否仅访问允许的数据。
见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 }