【发布时间】:2017-07-03 15:05:30
【问题描述】:
我正在使用 Firebase 实时数据库。我有以下数据:
我也有规矩:
{
"rules": {
".read": "auth != null",
".write": "auth != null",
"chat": {
"$key": {
".read": "data.child('memberId1').val() === auth.uid && data.child('memberId2').val() === auth.uid",
".write": "data.child('memberId1').val() === auth.uid || data.child('memberId2').val() === auth.uid"
}
},
初始规则完美运行:
".read": "auth != null",
".write": "auth != null",
问题
以下2条规则无效。
"chat": {
"$key": {
".read": "data.child('memberId1').val() === auth.uid && data.child('memberId2').val() === auth.uid",
".write": "data.child('memberId1').val() === auth.uid || data.child('memberId2').val() === auth.uid"
}
},
如您所见,为了测试这些规则,在第一条规则中,我设置了一个不可能的条件,即memberId1 和memberId2 都等于用户uid。结果,我预计它会失败。
如果我删除:
".read": "auth != null",
".write": "auth != null",
只要有:
"chat": {
"$key": {
".read": "data.child('memberId1').val() === auth.uid || data.child('memberId2').val() === auth.uid",
".write": "data.child('memberId1').val() === auth.uid || data.child('memberId2').val() === auth.uid"
}
},
然后访问被拒绝。即使我将其更改为:
"data.child('memberId1').val() === 'h6qQg5YfQveTaCyBEXwDMSJPqwk1'
以下也被拒绝:
"chat": {
"Ko7w9XTtuRVN4p6CMp7": {
".read": true,
问题
我应该如何构建规则以允许用户只能访问其uid 匹配memberId1 或memberId2 的行?
谢谢
更新
我有以下代码:
findChats(): Observable<any[]> {
return this.af.database.list('/chat/', {
query: {
orderByChild: 'negativtimestamp'
}
}).map(items => {
const filtered = items.filter(
item => (item.memberId1 === this.me.uid || item.memberId2 === this.me.uid)
);
return filtered;
});
}
我的问题类似于this one。我尝试以下但没有成功:
{
"rules": {
"chat": {
"$id": {
".read": true
}
},
【问题讨论】:
-
你读得怎么样?请在您读取数据的地方添加代码。
-
您好 adolfosrs,感谢您的回复。我在上面添加了一个更新,显示了我如何查询数据库。我的问题是我没有完整的 jsonpath(只有
/chat/)吗?有没有办法用这个 jsonpath 实现这个规则? -
希望答案对您有所帮助。
标签: firebase firebase-realtime-database firebase-authentication