【发布时间】:2018-09-28 10:44:04
【问题描述】:
如果登录用户是经理或记录不存在,我想允许写入/companies/{company}。
我有以下安全规则:
service cloud.firestore {
match /databases/{database}/documents {
function isManager() {
return get(/databases/$(database)/documents/managers/$(request.auth.uid)).data.id == request.auth.uid;
}
function companyExists(company) {
return exists(/databases/$(database)/documents/companies/$(company));
}
match /{document=**} {
allow read, write: if false;
}
match /companies/{company} {
allow read: if resource.data.isActive == true || isManager();
allow write: if !companyExists(company) || isManager();
}
}
}
下面这行有问题:
allow write: if !companyExists(company) || isManager();
即使!companyExists(company) 函数的计算结果为true,此条件的计算结果始终为false。
我确信 companyExists(company) 和 isManager() 函数可以按预期工作,因为我一直在单独测试它们。
例如,如果我使用以下规则:
allow write: if !companyExists(company);
如果公司记录不存在,则表达式的计算结果为 true。与isManager() 函数相同。如果登录用户的 ID 存在于 managers 集合中,则返回 true。只有在两个函数之间使用|| 运算符时才会出现该问题。
【问题讨论】:
-
您的前端代码结构如何?我遇到了类似的问题,解决方案是以正确的顺序初始化 firestore 绑定
标签: firebase google-cloud-firestore firebase-security