Javascript 用于Firebase规则的JsonPath
我有以下数据: 我有以下代码:Javascript 用于Firebase规则的JsonPath,javascript,firebase,firebase-realtime-database,firebase-authentication,jsonpath,Javascript,Firebase,Firebase Realtime Database,Firebase Authentication,Jsonpath,我有以下数据: 我有以下代码: findChats(): Observable<any[]> { return this.af.database.list('/chat/', { query: { orderByChild: 'negativtimestamp' } }).map(items => { const filtered =
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;
});
}
我在模拟器中使用以下各项进行测试:
/chat/-Ko7w9XTtuRVN4p6CMp7/memberId
它找到了一个匹配项
现在,当我使用此规则运行代码时,我得到:
错误:权限\在/chat被拒绝:客户端没有访问的权限
访问所需的数据
问题
这就是我无法让代码JsonPath通过规则的原因,因为它只是/chat/
为了匹配规则,代码JsonPath是否还必须包含$key
和成员ID
e、 g./chat/-ko7w9xturvn4p6cmp7/memberId
您可以从我的代码中看到,我正在尝试获取一个过滤的聊天列表
,而代码不知道$key
值是什么。那么,是否不可能对只允许访问匹配行的查询应用规则
更新
我的问题类似于。我尝试了以下方法,但没有成功:
{
"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"
}
}
}
出现错误的原因是Firebase规则级联 请查看的“读写规则级联”和“规则不是过滤器”部分 级联基本上意味着: .read和.write规则自上而下工作,较浅的规则优先于较深的规则。如果规则在特定路径上授予读取或写入权限,则它也会授予对其下所有子节点的访问权限 因此,如果某个规则将访问限制(或如果该规则不存在)到更高的节点,则您无法访问该节点 因此,在您的例子中,您可以通过从客户端代码访问
/chat/-ko7w9xturvn4p6cmp7/memberId
路径来测试它,您将看到它是有效的
Firebase文档中的以下示例是您的情况的副本:-
规则是以原子的方式应用的。这意味着,如果该位置或父位置没有授予访问权限的规则,则读或写操作将立即失败。即使每个受影响的子路径都是可访问的,在父位置的读取也将完全失败。考虑这个结构:
如果不理解规则是以原子方式评估的,它可能会
似乎获取/records/path将返回rec1而不是rec2。
然而,实际结果是一个错误:
嗨,罗汉,谢谢你的解释。因为规则是原子的,这意味着在我当前的AngularFire2实现中,使用jsonpath
返回这个.af.database.list(“/chat/”,
),我不可能添加这样的规则,即您只能使用匹配的成员ID1
访问聊天。我的问题是,当我运行查询时,我不知道$key
是什么(-Ko7w9XTtuRVN4p6CMp7
)是。例如/chat/-Ko7w9XTtuRVN4p6CMp7/memberId
嘿,Richard!很高兴我能帮上忙。另外,我认为这是不可能的,但我是否能够将AngularFire2查询更改为包含通配符($key
)以访问聊天
?例如this.af.database.list(“/chat/$key/memberId”
因此您可以将聊天密钥保存在两个用户的个人列表下,因为这就是数据非规范化的工作方式。我希望您找到最适合您的解决方案。祝您一切顺利!
{
"rules": {
"chat": {
".read": "auth != null",
".write": "auth != null"
},
"message": {
".read": "auth != null",
".write": "auth != null"
}
}
}
{
"rules": {
"records": {
"rec1": {
".read": true
},
"rec2": {
".read": false
}
}
}
}