【发布时间】:2020-09-22 14:35:25
【问题描述】:
我在对 firestore 数据库执行查询时注意到了这种奇怪的行为。
基本上,我正在尝试读取一个具有与当前登录用户的 uid 匹配的特定 documentid 的文档。
当我执行查询时,我得到 PERMISSION DENIED 并且文档的路径与该集合中的任何文档都不匹配。
这是执行的查询
Firestore _firestore = Firestore.instance;
在StreamBuilder 内
_firestore.collection('roleusers').document(uid).snapshots()
现在这是错误
W/Firestore( 8177): (21.3.0) [Firestore]: Listen for Query(roleusers/B70tIEbiEkXobNLZ049j) failed: Status{code=PERMISSION_DENIED, description=Missing or insufficient permissions., cause=null}
这些是roleusers 集合中的文档。
roleusers collection
如您所见,图片中没有一个文档与错误指向的 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();
}
isOwner 是这个函数的位置
function isOwner(){
return get(/databases/$(database)/documents/roleusers/$(request.auth.uid)).data.id ==
request.auth.uid
}
EDIT2:为了进一步解释我为什么要编写这样的规则:我的主要目标是允许用户只读取他们自己的文档并且只写入他们自己的文档。相反,管理员可以对任何用户文档执行任何操作。任何经过身份验证的用户都可以在roleusers 中创建文档,因为当新用户打开应用程序时,它会将信息写入数据库。
嵌套规则的目的是允许用户从roleusers中他的文档中的子集合orders中读取
最后一个带有递归通配符的规则需要执行collectionGroup查询以获取所有用户的所有订单。
我有点怀疑isOwner() 函数是否真的有效
EDIT3:这是isAdimn() 函数
function isAdmin(request) {
return request.auth.uid == "F7Ech2v4GpgFfSYpA1HRASYpQTD3"
|| request.auth.uid == "103162704257974620268"
}
【问题讨论】:
-
Permission denied 与文档的存在与否没有任何关系。它与安全规则有关。请编辑问题以显示您为 Firestore 启用的安全规则。
-
我没有看到 isAdmin。请进行编辑以显示完整的规则集,并帮助了解您的查询如何与规则匹配。
标签: firebase flutter dart google-cloud-firestore