【发布时间】:2020-12-02 19:38:18
【问题描述】:
我有一个 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(true)
var tempArray = []
var eventId = []
var db = firebase.firestore();
const eventsRef = await db.collection("events").get()
eventsRef.forEach((doc) => {
eventId.push(doc.id)
console.log('event:'+doc.id)
})
var eventItem = []
for(var i = 0; i< eventId.length; i++) {
const itemsRef = await db.collection("events").doc(eventId[i]).collection('eventItems').get()
itemsRef.forEach((item) => {
console.log('event item:'+item.id)
var item = {
id:eventId[i],
eventItemId:item.id
}
eventItem.push(item)
})
}
var allEvents = []
var date = new Date()
date -= (24 * 60 * 60 * 1000);
console.log('backdate:' + date)
for(var i = 0; i < eventItem.length; i++) {
const eItem = eventItem[i]
const doc = await db.collection("events").doc(eItem.id).collection('eventItems').doc(eItem.eventItemId).get()
var eventDate = doc.data()['date'].toDate()
console.log(eventDate)
if(eventDate.getTime() > date) {
var item = {
userId:eItem.id,
userData:doc.data()['userData'],
name:doc.data()['name'],
location:doc.data()['location'],
eventItemId:doc.id,
}
allEvents.push(item)
}
}
setMessageState(false)
setMultiEventData(allEvents)
}
const searchEvent = (event) => {
multiEventData.forEach((eventItem) => {
var item = eventItem
if(item.name.includes(event) === true) {
loadEventData(item.eventItemId,item.userId)
setSelectedEvent(item)
}
})
}
我也在另一个功能中登录。
useEffect(() => {
tempAuth();
loadMultiEventData()
},[]);
【问题讨论】:
-
安全规则本身不做任何事情。它们仅在客户端应用程序访问数据库时触发。请编辑问题以显示该应用程序代码,并解释为什么该规则未按您预期的方式运行。如果您的规则需要身份验证,您的代码还应证明用户在查询时已使用 Firebase 身份验证登录。
-
@DougStevenson 请检查添加的代码,我想要的是任何登录应用程序的用户都应该能够访问所有集合。简单。
-
我们仍然无法从您的代码中判断用户是否在查询时实际使用 Firebase Auth 登录,这是您的规则绝对要求的。也没有错误处理表明任何查询都失败了。请编辑问题以改进这些方面的代码。如果您添加日志记录或错误处理,请显示其输出。
-
@DougStevenson 你看到 useEffect 函数了吗?在问题和代码的底部?它调用 tempAuth,然后调用 loadMultiEventData,如果您在查询之前说我应该进行身份验证,那么我不知道,firebase 文档没有明确说明这一点。
-
@DougStevenson 一件事,我知道我需要先进行身份验证然后执行操作,但是当用户转到其他页面时会发生什么?这就是现在正在发生的事情。
标签: javascript firebase google-cloud-firestore firebase-security