繁体   English   中英

Map 通过 Firestore 安全规则中的数组

[英]Map through array in firestore security rule

我有一个包含三个 collections 的 firestore 数据库架构:

users
- name: string

brokers
- name: string
- members: array of User references

companies
- name: string
- brokers: array of Broker references

另外: users表的id和firebase认证中的UID是一样的。

我希望companies表只能由属于相关经纪人成员的用户读取。 安全规则应该是什么?

例如,假设我想通过以下查询和数据读取一家公司, user1应该可以做到,但user2不能:

// Query:

const company = db.collection('companies').doc('company1').get()
// Data:

  "users": {
    "user1": {
      "name": "Elon Musk"
    },
    "user2": {
      "name": "Jeff Bezos"
    }
  }

  "brokers": {
    "broker1": {
      "name": "Broker 1",
      "members": [
        "users/user1"
      ]
    }
  }

  "companies": {
    "company1": {
      "name": "SpaceX",
      "brokers": [
        "brokers/broker1"
      ]
    }
  }

我试过这个,但它只在一家公司链接到一个经纪人而不是一系列经纪人时才有效:

rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents { 
    function getUser() {
      return /databases/$(database)/documents/users/$(request.auth.uid)
    }
    
    function userIsMember(resource) {
      return "members" in resource.data && getUser() in resource.data.members
    }
    
    match /companies/{companyId} {
      function getBroker() {
        return get(/databases/$(database)/documents/brokers/$(resource.data.broker.id))
      }
        
      allow read: if userIsMember(getBroker());
    }
  }
}

安全规则本身不会过滤数据,而只是确保您的代码遵循您为它们设置的规则。 因此,如果您的规则规定用户只能阅读他们所属的文档,则查询应该只请求他们所属的文档。 这是一个常见的误解,并且在文档部分rules are not filters 中有所介绍。

看起来您将无法将getBroker规则转换为查询,因为无法对不属于查询结果一部分的数据设置条件。

顺便说一句,这两种限制的存在都是出于相同的原因:由于您需要为阅读的每个文档付费,如果 Firestore 必须检查每个潜在文档以符合您的规则/查询,事情就会很快变得昂贵。

解决方案通常是将必要的数据复制到每个公司文档中,尽管您必须确定这是否适用于您的用例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM