我有以下数据:
我有以下代码:
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;
});
}
如果我使用上面的JsonPath('/chat/'
)来访问数据库,它会返回所有匹配的行,然后代码会过滤结果。
我确实定义了以下数据库规则:
{
"rules": {
"chat": {
"$key": {
".read": true
}
},
....
我在模拟器中测试:
/chat/-Ko7w9XTtuRVN4p6CMp7/memberId
它找到了匹配。
现在,当我使用此规则运行代码时,我得到:
错误:/ chat的permission_denied:客户端没有权限 访问所需的数据
问题
我无法让代码JsonPath通过规则,因为它只是/chat/
?
为了使其与规则匹配,代码JsonPath是否还必须包含$key
和memberId
?
e.g。 /chat/-Ko7w9XTtuRVN4p6CMp7/memberId
从我的代码中可以看出,我正在尝试获取已过滤的chats
列表,但代码不知道$key
值是什么。那么是否不可能将规则应用于只允许访问匹配行的查询?
更新
我的问题类似于this one。我尝试以下方法但没有成功:
{
"rules": {
".write": "auth != null",
"chat": {
"$id": {
".read": true
}
},
更新
我目前有以下规则可行,但这还不够。它会检查用户是否经过身份验证,但不是auth.id
等于memberId1
或memberId2
。
{
"rules": {
"chat": {
".read": "auth != null",
".write": "auth != null"
},
"message": {
".read": "auth != null",
".write": "auth != null"
}
}
}
答案 0 :(得分:1)
您收到错误的原因是Firebase规则级联。
请查看&#34;读写规则级联&#34;和&#34;规则不是过滤器&#34; this doc的部分。
级联基本上意味着以下内容: -
.read和.write规则从上到下工作,较浅的规则覆盖了更深层次的规则。如果规则在特定路径上授予读取或写入权限,则它还授予对其下所有子节点的访问权限。
因此,如果规则限制访问(或者如果规则不存在)更高的节点,则您无法访问该节点。
因此,在您的情况下,您可以通过访问客户端代码中的/chat/-Ko7w9XTtuRVN4p6CMp7/memberId
路径来测试它,并且您会发现它可以正常运行。
Firebase文档中的以下示例是您的情况的副本: -
规则以原子方式应用。这意味着如果在该位置或授予访问权限的父位置处没有规则,则读取或写入操作会立即失败。即使可以访问每个受影响的子路径,在父位置读取也将完全失败。考虑这个结构:
{
"rules": {
"records": {
"rec1": {
".read": true
},
"rec2": {
".read": false
}
}
}
}
如果不理解规则是以原子方式评估的,那么它可能会 看起来像抓取/ records / path会返回rec1而不是rec2。 但实际结果是错误: