Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/467.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
Javascript 基于Firestore规则身份验证的文档访问不起作用_Javascript_Firebase_Google Cloud Firestore_Firebase Security - Fatal编程技术网

Javascript 基于Firestore规则身份验证的文档访问不起作用

Javascript 基于Firestore规则身份验证的文档访问不起作用,javascript,firebase,google-cloud-firestore,firebase-security,Javascript,Firebase,Google Cloud Firestore,Firebase Security,我有一个Firestore数据库和一个集合,我想将规则设置为访问该集合。 我正在使用以下规则,但它不起作用 service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if request.auth != null; } // other rules go here... } } 但是reque

我有一个Firestore数据库和一个集合,我想将规则设置为访问该集合。 我正在使用以下规则,但它不起作用

service cloud.firestore {
  match /databases/{database}/documents {

    match /{document=**} {
      allow read, write: if request.auth != null;
    }

  // other rules go here...

  }
}
但是request.auth!=null根本不起作用,不确定出了什么问题,我只有一个名为“events”的数据库集合根

谢谢你的帮助

以下是从集合中访问事件的代码

const loadMultiEventData=async()=>{
setMessageState(真)
var tempArray=[]
var eventId=[]
var db=firebase.firestore();
const eventsRef=await db.collection(“事件”).get()
eventsRef.forEach((doc)=>{
事件id.push(文档id)
console.log('事件:'+doc.id)
})   
var eventItem=[]
对于(变量i=0;i{
console.log('事件项:'+项.id)
变量项={
id:eventId[i],
eventItemId:item.id
}
eventItem.push(项目)
})
}
var allEvents=[]
变量日期=新日期()
日期-=(24*60*60*1000);
console.log('回溯日期:'+日期)
对于(var i=0;idate){
变量项={
userId:eItem.id,
userData:doc.data()['userData'],
名称:doc.data()['name'],
位置:doc.data()['location'],
eventItemId:doc.id,
}
所有事件。推送(项目)
}
}
setMessageState(错误)
setMultiEventData(allEvents)
}
const searchEvent=(事件)=>{
multiEventData.forEach((eventItem)=>{
var item=eventItem
if(item.name.includes(event)==true){
loadEventData(item.eventItemId、item.userId)
设置选定事件(项目)
}
})
}
如果安全规则与此有关,您将收到“权限被拒绝”错误。你发现你的错误了吗

我能马上看到的是那条线

const itemsRef = await db.collection("events").doc(eventId[i]).collection('eventItems').get()

但是.collection.get()不返回数组。它返回一个QuerySnapshot,它有一个属性。docs是QueryDocumentSnapshot的数组。

安全规则本身不起任何作用。它们仅在客户端应用程序访问数据库时触发。请编辑问题以显示该应用程序代码,并解释为什么该规则没有按照您期望的方式工作。如果您的规则需要auth,则您的代码还应证明用户在查询时确实已使用Firebase auth登录。@DougStevenson请检查添加的代码,我只希望登录应用程序的任何用户都能够访问所有集合。很简单。我们仍然无法从您的代码中判断用户在查询时是否实际使用Firebase Auth-in进行了签名,这是您的规则绝对需要的。也没有错误处理表明任何查询都失败。请编辑问题以改进这些方面的代码。如果您添加日志记录或错误处理,请显示其输出。@DougStevenson是否看到useEffect函数?在问题和代码的底部?它调用tempAuth,然后加载multieventdata,如果您在查询之前说我应该做auth,那么我不知道,firebase文档没有明确说明这一点。@DougStevenson一件事,我知道我需要先做auth,然后执行操作,但当用户转到其他页面时会发生什么?这就是现在正在发生的事情。基本上我不知道你们想说什么,但当规则设置为放松/测试模式时,上面的代码就是工作代码。