Firebase firestore查询中的文档id错误
我在对firestore数据库执行查询时注意到了这种奇怪的行为。 基本上,我尝试读取一个文档,该文档具有与当前登录用户的uid匹配的特定documentid。 执行查询时,权限被拒绝,文档路径与该集合中的任何文档都不匹配 这是执行的查询Firebase firestore查询中的文档id错误,firebase,flutter,dart,google-cloud-firestore,Firebase,Flutter,Dart,Google Cloud Firestore,我在对firestore数据库执行查询时注意到了这种奇怪的行为。 基本上,我尝试读取一个文档,该文档具有与当前登录用户的uid匹配的特定documentid。 执行查询时,权限被拒绝,文档路径与该集合中的任何文档都不匹配 这是执行的查询 Firestore _firestore = Firestore.instance; 在一个StreamBuilder里 这就是错误所在 W/Firestore( 8177): (21.3.0) [Firestore]: Listen for Query(ro
Firestore _firestore = Firestore.instance;
在一个StreamBuilder里
这就是错误所在
W/Firestore( 8177): (21.3.0) [Firestore]: Listen for Query(roleusers/B70tIEbiEkXobNLZ049j) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
这些是Roleuser系列中的文件。
正如您所看到的,图片中没有一个文档与错误所指向的documentid匹配
编辑:以下是我的firestore规则:
match /roleusers/{roleusersID} {
allow read: if isAdmin(request) || request.auth.uid == roleusersID;
allow write: if isAdmin(request) || request.auth.uid == roleusersID;
allow create: if isSignedIn();
match /roleusers/{roleusersId}/orders/{orderID} {
allow read: if isAdmin(request) || request.auth.uid == roleusersID;
allow write: if isAdmin(request) || request.auth.uid == roleusersID;
}
}
match /{path=**}/orders/{orderID} {
allow read: if isAdmin(request) || isOwner();
allow update: if isAdmin(request)
allow create: if isOwner();
}
此函数在哪里
function isOwner(){
return get(/databases/$(database)/documents/roleusers/$(request.auth.uid)).data.id ==
request.auth.uid
}
EDIT2:进一步解释我为什么这样写规则:我的主要目标是允许用户只读取自己的文档,只写入自己的文档。管理员可以对任何用户文档执行任何操作。任何经过身份验证的用户都可以在roleusers中创建文档,因为当新用户打开应用程序时,它会将信息写入数据库
嵌套规则的目的是允许用户在roleusers中读取其文档中的子集合命令
最后一个规则是递归通配符,需要执行collectionGroup查询以从所有用户获取所有订单
我有点怀疑isOwner函数是否真的起作用了
编辑3:这是isAdimn函数
这是因为firebase安全规则。请阅读Firebase官方文件。它解释了如何解决这个问题。
被拒绝的权限与文档的存在或不存在无关。这与安全规则有关。请编辑此问题以显示您对Firestore激活的安全规则。我看不到iAdmin。请编辑以显示完整的规则集,并帮助理解您的查询如何匹配规则。
function isOwner(){
return get(/databases/$(database)/documents/roleusers/$(request.auth.uid)).data.id ==
request.auth.uid
}
function isAdmin(request) {
return request.auth.uid == "F7Ech2v4GpgFfSYpA1HRASYpQTD3"
|| request.auth.uid == "103162704257974620268"
}