service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyName=**}{
allow read,write: if isUserAuthorized(companyName,get(/databases/$(database)/documents/companies/$(companyName)/users/$(request.auth.uid)).data.company) == true;
}
}
}
function isUserAuthorized(requestedCompanyName,userCompanyName) {
return requestedCompanyName == userCompanyName;
}
在上面的firestore规则中,我试图确保只有公司的员工才能访问该公司的数据。 firestore上的数据结构如下面的屏幕截图所示。 数据保存在此路径/ companies / {companyName} / users / {uid} / company
中但是当我尝试保存时,我得到Error: Missing or insufficient permissions.
js错误。
答案 0 :(得分:1)
目前无法测试规则。
你可以试试这个
match /companies/{companyName=**}{
allow read,write: if get(/databases/$(database)/documents/companies/$(companyName)/users/$(request.auth.uid)).company in [$(companyName)] || get(/databases/$(database)/documents/companies/$(companyName)/users/$(request.auth.uid)).data.company in [$(companyName)];
}
表示如果path/users/$(request.auth.uid)).data.company
具有companyName
尝试解决当前的问题
service cloud.firestore {
match /databases/{database}/documents {
match /companies/{companyName=**}{
allow read,write: if isUserAuthorized(companyName,get(/databases/$(database)/documents/companies/$(companyName)/users/$(request.auth.uid)).data.company) ;
}
}
}
function isUserAuthorized(requestedCompanyName,userCompanyName) {
return requestedCompanyName == userCompanyName;
}
答案 1 :(得分:0)
我知道这是一个老问题,但万一它可以帮助其他人:
我认为问题出在"匹配"声明,在这里:
match /companies/{companyName=**}{
allow read,write: if isUserAuthorized(companyName,get(/databases/$(database)/documents/companies/$(companyName)/users/$(request.auth.uid)).data.company) == true;
}
根据this,
使用递归通配符语法时,通配符变量将包含整个匹配的路径段,即使文档位于深层嵌套的子集合中也是如此。例如,上面列出的规则将匹配位于/ cities / SF / landmarks / coit_tower的文档,文档变量的值将为SF / landmarks / coit_tower。
当匹配路径中的最后一项以=**
结尾时,您将路径的整个剩余部分分配给变量companyname
。因此,从您的示例中获取值,您可能希望companyname
包含spoor
,但实际上它包含/spoor/users/iKHFF...
,除非该请求专门用于" spoor"文献。因此,get()
中的路径未指向正确的文档。
实际上,如果有可用的调试工具会很好,但到目前为止我还没有发现任何其他的试错。这很不幸,希望在退出测试版之前得到解决。