首页 > 解决方案 > 读取具有规则限制的 firebase 实时数据库子集

问题描述

我有一个结构如下的firebase实时数据库:

{
  "USERS": {
    "user-1": { ... },
    "user-2": { ... }
  }
  "GROUPS": {
    "group-1": {
      "id": "group-1",
      "AUTH": {
        "user-1": true,
      }
    },
    "group-2": {
      "id": "group-2",
      "AUTH": {
        "user-2": true
      }
    },
    "group-3": {
      "id": "group-3",
      "AUTH": {
        "user-1": true,
        "user-2": true
      }
    }
  }
}

我知道我可以授予仅属于特定组的用户读取权限的读取权限,如下所示:

{ 
  "rules": {
    "GROUPS": {
      "$groupId": {
        ".write": false,
        ".read": "auth != null && data.child('AUTH').child(auth.uid).exists()"
      }
    }
  }
}

我试图找到一个查询+规则组合,它将返回登录用户所属的所有组。

例如:登录“user-1”的查询和firebase规则更改返回以下快照:

{
  "group-1": {
    "id": "group-1",
    "AUTH": {
      "user-1": true,
    }
  },
  "group-3": {
    "id": "group-3",
    "AUTH": {
      "user-1": true,
      "user-2": true
    }
  }
}

或者

[
  {
    "id": "group-1",
    "AUTH": {
      "user-1": true,
    }
  },
  {
    "id": "group-3",
    "AUTH": {
      "user-1": true,
      "user-2": true
    }
  }
]

查询“GROUPS”引用现在给我一个“权限被拒绝”错误。

将 '.read=true' 添加到组中:

{ 
  "rules": {
    "GROUPS": {
      ".read": true,
      "$groupId": {
        ".write": false,
        ".read": "auth != null && data.child('AUTH').child(auth.uid).exists()"
      }
    }
  }
}

或通过条件的“.read”的任何组合,使每个人都可以访问所有数据。

有没有办法(在当前结构中)通过向规则添加一些限制来查询数据库并从“GROUPS”分支获取我所属的所有组?还是我需要在每个用户下维护他所属组的列表?

标签: firebasefirebase-realtime-database

解决方案


推荐阅读