【问题标题】:Firestore rule auth based document access doesnt work基于 Firestore 规则身份验证的文档访问不起作用
【发布时间】: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


【解决方案1】:

如果安全规则与它有关,您将收到“权限被拒绝”错误。你发现你的错误了吗?

可以立即看到的是线条

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

但 .collection.get() 不返回数组。它返回一个 QuerySnapshot,它有一个 PROPERTY .docs,它是一个 QueryDocumentSnapshots 数组。

【讨论】:

  • 基本上我不知道你想说什么,但是当规则设置为放松/测试模式时,上面的代码是工作代码。
猜你喜欢
  • 2018-04-04
  • 2019-04-04
  • 2013-05-29
  • 1970-01-01
  • 1970-01-01
  • 2019-07-15
  • 1970-01-01
  • 2023-04-08
  • 2021-07-23
相关资源
最近更新 更多