我正在按照https://firebase.google.com/docs/firestore/solutions/role-based-access中的建议,尝试使用Firestore规则仅返回当前用户具有某种权限的文档。
但是,当我执行该规则时,我得到了可怕的“ [code = permission-denied]:缺少权限或权限不足”错误消息,显然我什么也没告诉我,我想知道是否有人可以发现问题所在。
我的规则:
//Specific project rules - authorised users who appear in the project list
match /documents/{document} {
function isSignedIn() {
return request.auth.uid != null;
}
function getUser(rsc) {
return rsc.data.users[request.auth.uid];
}
function isOneOfUsers(rsc, array) {
return isSignedIn() && (getUser(rsc) in array);
}
allow list: if isOneOfUsers(resource, ['user','admin']);
数据将用户信息存储在文档的一个字段中(在下面的示例中为12345。该字段的类型为Object,这使我可以放置一个密钥(在下面的示例中为userid,76544)和一个值) ,例如“ admin”。
我的数据:
documents/12345/users{76544:"admin"}
现在,当我登录并尝试获取文档列表时,我希望看到此文档回来,但是出现错误。我可以将函数getUser更改为返回“用户”,并且可以正常工作,因此问题出在
的评估中rsc.data.users[request.auth.uid]
我通常会接受我正在尝试做一些无法完成的事情,但这是官方文档的近乎直接的副本,所以我一定会缺少一些东西!
预先感谢您的帮助
答案 0 :(得分:0)
我想这就是发生的事情:LIST显然没有检查要拾取的每个文档,规则不是过滤器等。
在编写查询以检索文档时,请记住安全性 规则不是过滤器-查询全部或全部。为了节省您的时间, 资源,Cloud Firestore根据潜在查询评估查询 结果集,而不是所有您的实际字段值 文件。如果查询可能返回文档, 客户端没有读取权限,整个请求失败。
因此,LIST将始终返回/ documents /的完整列表,除了授权规则,您无法在其中写任何东西,这将阻止它返回所有文件。如果是这样,那么如果任何恶意行为者获得了身份验证,他们都可以下载所有/ documents /的完整列表。
唯一明智的方法是锁定所有尝试使用LIST的尝试(全部拒绝),并使您的列表可访问/ documents /禁止单个用户使用。这似乎很麻烦,但可能是唯一的方法。