使用Firestore规则限制阵列键上的列表失败

时间:2018-07-31 16:36:56

标签: google-cloud-firestore firebase-security-rules

我正在按照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]

我通常会接受我正在尝试做一些无法完成的事情,但这是官方文档的近乎直接的副本,所以我一定会缺少一些东西!

预先感谢您的帮助

1 个答案:

答案 0 :(得分:0)

我想这就是发生的事情:LIST显然没有检查要拾取的每个文档,规则不是过滤器等。

  

在编写查询以检索文档时,请记住安全性   规则不是过滤器-查询全部或全部。为了节省您的时间,   资源,Cloud Firestore根据潜在查询评估查询   结果集,而不是所有您的实际字段值   文件。如果查询可能返回文档,   客户端没有读取权限,整个请求失败。

因此,LIST将始终返回/ documents /的完整列表,除了授权规则,您无法在其中写任何东西,这将阻止它返回所有文件。如果是这样,那么如果任何恶意行为者获得了身份验证,他们都可以下载所有/ documents /的完整列表。

唯一明智的方法是锁定所有尝试使用LIST的尝试(全部拒绝),并使您的列表可访问/ documents /禁止单个用户使用。这似乎很麻烦,但可能是唯一的方法。