Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase Firestore:用于全局读取访问的嵌套安全规则_Firebase_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Firebase Firestore:用于全局读取访问的嵌套安全规则

Firebase Firestore:用于全局读取访问的嵌套安全规则,firebase,google-cloud-firestore,firebase-security,Firebase,Google Cloud Firestore,Firebase Security,这是对这篇文章的后续报道: 我很难弄清楚Firestore是如何工作的 假设我有这样一个基本集合: { name: "Base 1", roles : { user_1: true } }, { name: "Base 2", roles : { user_2: true } } 我想获取用户_1在resource.roles中的所有基。我愿意: db.collection('base')。其中('roles.

这是对这篇文章的后续报道:

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

假设我有这样一个基本集合:

{
  name: "Base 1",
  roles : {
     user_1: true
  }
},
{
  name: "Base 2",
  roles : {
     user_2: true
  }
}
我想获取用户_1在resource.roles中的所有基。我愿意:
db.collection('base')。其中('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()
方法收到的权限不足。有趣的是,当我将read取消注释到
/bases/{baseId}
中时,它工作得非常好(当然,如果我注释
/bases/{document=**}

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

非常感谢您的帮助:)


附言:我没有找到在模拟器中模拟nodejs.get()的方法,学习这些东西不是很方便。您是否已按照中所述声明了服务和数据库声明?另外,请查看下一篇关于递归通配符的文章。@nibrash是的,我文章中的所有规则都封装在
match/databases/{database}/documents{..}
中。我想知道我是否应该在/bases/document=**中放入LIST而不是READ,但还没有时间尝试……运行查询的代码是使用firestore库还是Admin SDK?SignedIn()是如何定义的?另外,请你澄清一下实际使用的是哪些规则,在规则注释和解释之间进行猜测有点混乱。这非常混乱!但您猜对了,我在客户端和服务器端混淆了它,实际上是我的规则的函数signedIn()没有经过身份验证。虽然我不确定如何在服务器端验证客户机用户,但我设法使其在客户机站点上工作。我的第一个困惑是,当获取包含多个文档的列表时,/bases/{baseId}也会适用……如果您发现了问题所在以及问题的解决方法,请将其添加为答案,以便其他用户可以从信息中受益。您是否已按中所述声明了服务和数据库声明?另外,请查看下一篇关于递归通配符的文章。@nibrash是的,我文章中的所有规则都封装在
match/databases/{database}/documents{..}
中。我想知道我是否应该在/bases/document=**中放入LIST而不是READ,但还没有时间尝试……运行查询的代码是使用firestore库还是Admin SDK?SignedIn()是如何定义的?另外,请你澄清一下实际使用的是哪些规则,在规则注释和解释之间进行猜测有点混乱。这非常混乱!但您猜对了,我在客户端和服务器端混淆了它,实际上是我的规则的函数signedIn()没有经过身份验证。虽然我不确定如何在服务器端验证客户机用户,但我设法使其在客户机站点上工作。我的第一个困惑是,当获取包含多个文档的列表时,/bases/{baseId}也将适用……如果您发现了问题所在以及解决方法,请将其添加为答案,以便其他用户可以从信息中受益。