【问题标题】:Complex firestore rules复杂的 Firestore 规则
【发布时间】:2021-06-21 19:45:05
【问题描述】:

我有一个顶级集合:“组织”,在该集合文档中有一个这样的员工地图:

employees: {
  uid1: {
    displayName: John Do
    [...]
  }
  uid2 {
   [...]
  }
}

我还有另一个顶级集合:“客户”,其组织结构图如下:

organizations: {
  organizationId1: some string,
  organizationId2: some other string,
  [...]
}

地点:

  • uid 是来自 firebase auth 的用户 ID
  • organizationId 是组织文档的文档 ID。

用户可以在多个组织中,客户也可以在多个组织之间共享。

我想保留对客户文档的访问权限,用户是客户文档中列出的至少一个组织的员工。

有没有办法在firestore.rules中循环

我认为答案可能是 mapDiff 和自定义声明。

用户自定义声明:

organizations:[organizationId1, organizationId2, ...]

但我在理解文档时遇到了一些困难: https://firebase.google.com/docs/reference/rules/rules.MapDiff

有没有办法做到这一点?

【问题讨论】:

    标签: google-cloud-firestore firebase-security


    【解决方案1】:

    也许我没有理解正确,但你可以试试这样的:

    允许读、写:if employeeOrganization in [organization1, organization2...]

    https://firebase.google.com/docs/reference/rules/rules.List

    【讨论】:

      【解决方案2】:

      我终于找到了为此制定规则的方法:

       match /customer/{cId} {
            allow create: if request.auth != null;
            allow read, update: if (request.auth.token.organisations.keys().hasAny(resource.data.organizationIds.keys()));
            allow delete: if false;
          }
      

      我的自定义声明如下: (只有1到5个组织,所以传输不重)

      organizations:{
        organizationId1: "role",
        organizationId2: "admin",
        ...
      }
      

      我的客户文档是这样的地图:

      organizationIds{
        organization1Id: "some AES key used for security purpose",
        organization358Id: "some AES key used for security purpose"
      }
      

      效果很好,使用自定义声明每天可以节省无数阅读量。

      【讨论】:

        猜你喜欢
        • 2018-11-09
        • 2012-05-13
        • 2011-12-21
        • 2017-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-22
        • 1970-01-01
        相关资源
        最近更新 更多