这是我现在面临的 Firestore 安全规则问题。
首先,这是我的 firestore 数据库中的数据结构示例:
userProfiles/userId/userData
companies/companyId/companyData
看起来很简单。每个userData
包括一个名为companies
其中包括该用户有权访问的所有 companyId。
现在我需要编写规则,仅当 companyId 位于特定用户信息公司列表中时才允许读取 companyData。
以下是规则work for me:
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyId} {
allow read: if companyId in get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
}
}
}
考虑到我将拥有更多规则,我想让它们更具可读性并且更易于重用。根据这个官方指南我可以创建自定义函数并根据此article它们可以是通用的并在主规则块之外声明。
我重构了我的规则,看起来像这样,它也worked for me:
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyId} {
allow read: if companyId in getUserCompanies()
}
function getUserCompanies() {
return get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
}
}
}
但现在我想将函数移到规则块之外以使其更加清晰:
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyId} {
allow read: if companyId in getUserCompanies()
}
}
}
function getUserCompanies() {
return get(/databases/$(database)/documents/userProfiles/$(request.auth.uid)).data.companies
}
但这是行不通的。没有任何错误,我只是收到常规的Read denied
来自模拟器的消息。
所以问题是:是否可以像我在示例中所做的那样将函数移到外部?我在这里犯了什么明显的错误吗?有没有更好的方法让我的规则更加清晰?
附:
我还尝试向该函数传递一些参数,包括用户和公司 ID - 没有成功。