Firebase 基于角色访问FireStore

Firebase 基于角色访问FireStore,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,我正试图实现对Firebase Firestore的基于角色的访问,但尽管我查看了谷歌做得很好的文档,但还是没能让它正常工作。 我在每个用户文档中设置了一个字符串“role”。文档本身具有用户的uid 我访问users集合的规则如下所示,写入规则一定是错误的: service cloud.firestore { match /databases/{database}/documents { match /users/{document} { allow read: if

我正试图实现对Firebase Firestore的基于角色的访问,但尽管我查看了谷歌做得很好的文档,但还是没能让它正常工作。 我在每个用户文档中设置了一个字符串“role”。文档本身具有用户的uid

我访问users集合的规则如下所示,写入规则一定是错误的:

service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{document} {
      allow read: if get(/databases/$(database)/documents/users/$(request.auth.id)/role/$(role)) == "Mitarbeiter"
   }
  }
}

XCode控制台错误:

[Firebase/Firestore][I-FST000001] Listen for query at users/EStQNC4cYcaSnKpxs4XnQf96brm2 failed: Missing or insufficient permissions.

文档的路径
get()
正在查看名为“角色”的子集合,但您没有:

/users/$(request.auth.id)/role/$(role)
另外,我们在这里看不到名为“role”的变量

根据您所展示的内容,您需要的角色似乎在文档本身中,因此不需要使用
get()
。就这样检查一下:

allow read: if resource.data.role == "Mitarbeiter";

如果没有规则应允许或拒绝的客户端代码,安全规则将毫无用处。请编辑问题以显示未按预期方式运行的查询,因此,我们可以看到它们可能存在冲突。另外,我强烈建议使用用户的UID而不是他们的电子邮件地址来分配权限。@DougStevenson我添加了Swift中的代码,并将其和我的FireStore数据库调整到UID中。您的规则是在名为“角色”的子集合中的文档中检查角色,但你好像没有。用户文档本身中有一个角色字段。您的规则实际上试图实现什么?我想在Swift中将变量userData.accountLevel分配给登录用户的FireStore条目“role”的值。只有在其自己的用户收集文档中具有“Mitarbeiter”角色的用户才允许读取该值。稍后我想让它变得更复杂/有用,但目前我只想了解使用用户文档中的“角色”字段作为访问指示器的语法。