[英]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.