首页 > 解决方案 > Firebase Firestore:用于全局读取访问的嵌套安全规则

问题描述

这是这篇文章的后续内容:Firebase Firestore 安全规则 - 根据资源读取所有嵌套文档(但它为空)

我很难弄清楚 Firestore 是如何工作的!

所以假设我有这个 Bases 集合:

{
  name: "Base 1",
  roles : {
     user_1: true
  }
},
{
  name: "Base 2",
  roles : {
     user_2: true
  }
}

我想获取 user_1 在 resource.roles 中的所有 Base。我愿意 : db.collection('bases').where('roles.user_1', '==', true).get()

而且效果很好。所有服务器端,因此没有人可以尝试更改过滤器:一切都很好。

但是,我想在 Firestore 中使用安全规则强制执行此过滤器。只是要确定!所以我写了:

function hasRole(){
    return request.auth.uid in resource.data.roles
}
match /bases/{document=**}{
    allow read: if true; // signedIn() && hasRole();
}

match /bases/{baseId}{
    // allow read: if signedIn() && hasRole();
    allow update, delete: if false && signedIn()
    allow create: if signedIn()
}

当我尝试访问规则模拟器中的特定资源但现在我的.get()方法收到的权限不足时,它可以工作。有趣的是,当我取消注释读入/bases/{baseId}它时,它的效果很好(/bases/{document=**}当然,如果我评论的话)。

所以我可以让它工作,但我仍然想了解为什么 {document=**} 规则在模拟器中工作,而不是在我尝试从服务器获取时。

非常感谢你的帮助 :)

PS:我没有找到在模拟器中模拟nodejs .get() 的方法,学习这些东西不是超级方便。任何有关这方面的资源都将被阅读并有所帮助。

标签: firebasegoogle-cloud-firestorefirebase-security

解决方案


推荐阅读