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
      }
    }
  }
}