Firestore安全规则记录变量值

时间:2017-11-07 11:29:06

标签: firebase firebase-security google-cloud-firestore

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

enter image description here

但是当我尝试保存时,我得到Error: Missing or insufficient permissions. js错误。

  • 有什么明显我做错了吗?
  • 在firestore端是否有任何日志记录,我可以看到请求是什么以及规则中使用的变量值是什么。
  • 或者有没有办法测试规则?

2 个答案:

答案 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()中的路径未指向正确的文档。

实际上,如果有可用的调试工具会很好,但到目前为止我还没有发现任何其他的试错。这很不幸,希望在退出测试版之前得到解决。