JsonPath用于Firebase规则

时间:2017-07-03 17:38:37

标签: javascript firebase firebase-realtime-database firebase-authentication jsonpath

我有以下数据:

enter image description here

我有以下代码:

   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是否还必须包含$keymemberId

e.g。 /chat/-Ko7w9XTtuRVN4p6CMp7/memberId

从我的代码中可以看出,我正在尝试获取已过滤的chats列表,但代码不知道$key值是什么。那么是否不可能将规则应用于只允许访问匹配行的查询?

更新

我的问题类似于this one。我尝试以下方法但没有成功:

{
  "rules": {
      ".write": "auth != null",
      "chat": {
        "$id": {
            ".read": true
        }
      },

更新

我目前有以下规则可行,但这还不够。它会检查用户是否经过身份验证,但不是auth.id等于memberId1memberId2

{
  "rules": {
    "chat": {
      ".read": "auth != null",
      ".write": "auth != null"
    },
    "message": {
      ".read": "auth != null",
      ".write": "auth != null"
    }
  }
}

1 个答案:

答案 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。   但实际结果是错误: