用户注册后,应用程序会将用户使用为Firebase身份验证生成的 uid 保存在Firestore中。现在,我尝试为一个单独的集合(而不是用户集合)编写一个安全规则,其中仅当请求者的 read 和 write 操作才允许该请求者strong> isAdmin 字段设置为true。正如您在图像上看到的那样,即使 get()函数中的路径正确,我也会遇到不存在的错误。是什么原因导致此错误?
我尝试了许多路径变化,更改集合,将所有内容都小写等。我在Google中找不到关于此的任何内容,官方文档中也以与我使用相同的方式显示了用法。
安全规则:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /user/{user} {
allow read,write: if true
}
match /akarmi/{akarmiId}{
allow read, write:
if get(/databases/$(database)/documents/user/$(request.auth.uid)).data.isAdmin == true
}
}
}
我希望这段代码能够运行并允许或禁止访问,并且不会抛出不存在的错误。
答案 0 :(得分:1)
Working 好的,对于模拟器,firebase uid必须是实际的uid,而我改用request.auth.uid,只提供了电子邮件。提供实际的uid解决了该问题。该错误消息非常令人误解。
答案 1 :(得分:1)
上述Yoann的回应帮助了我。
我必须将用户名提供给模拟器。这样就可以使用get()和exist()函数进行测试,并可以检查数据库条目中的用户角色。
答案 2 :(得分:0)
尝试如下更改代码:
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
match /user/{user} {
allow read,write: if true
}
match /akarmi/{akarmiId}{
allow read, write:
if get(/databases/$(database)/documents/user/$(request.auth.uid)).data.isAdmin == true ||
get(/databases/$(database)/documents/user/$(request.auth.uid)).isAdmin == true
}
}
}
根据this帖子,其中是安全规则中的错误。可能情况仍然没有解决。