如果登录的用户是管理员 OR 记录不存在,我想允许写入/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();
即使false
函数的计算结果为!companyExists(company)
,此条件也始终计算为true
。
我确定companyExists(company)
和isManager()
函数可以按预期工作,因为我已经分别对其进行了测试。
例如,如果我使用以下规则:
allow write: if !companyExists(company);
然后,如果公司记录不存在,则表达式的计算结果为true
。与isManager()
函数相同。如果true
集合中存在登录用户的ID,它将返回managers
。仅当在两个函数之间使用||
运算符时,问题才会出现。
答案 0 :(得分:0)
似乎您想允许所有人创建公司,但只有经理可以编辑它们。这可以通过更简单的方式实现:
match /companies/{company} {
allow read: if resource.data.isActive == true || isManager();
allow create;
allow update, delete: if isManager();
}
它也会更便宜,因为您不需要执行get请求来检查它是否存在。
此外,还可以使用自定义声明(而不是文档)来重写isManager的逻辑,这样您还可以保存另一次读取。这超出了此问题的范围,但是如果您需要更多详细信息,请发表评论。
答案 1 :(得分:0)
没有工作:
allow read: if request.auth.uid != null || if request.auth.uid == "VacOqosKJhPjxQaCf93wGVjc8Fy2"
这样工作:
allow read: if request.auth.uid != null;
allow read: if request.auth.uid == "GePV7U9kDmfThLVXzks6nn2HgXn2";