【问题标题】:Firebase Realtime Database - Determine if user has access to pathFirebase 实时数据库 - 确定用户是否有权访问路径
【发布时间】:2021-01-26 00:19:10
【问题描述】:

我更新了我的 Firebase 实时数据库访问规则,并注意到一些客户端现在尝试访问他们无权访问的路径。这没关系 - 但我的问题是我的代码在无法读取受限节点后停止。

我在控制台中看到以下错误,然后停止加载后续数据:

permission_denied at /notes/no-access-node

我首先从/access_notes/uid 收集访问节点,然后继续从/notes/noteId 读取所有数据。 我从下面的数据库中收集notes的代码:

//*** SUBSCRIPTION */
database.ref(`access_notes/${uid}`).on('value', (myNotAccessSnaps) => {
  let subscrPromises = []
  let collectedNots = {}
  // Collect all categories we have access to
  myNotAccessSnaps.forEach((accessSnap) => {
    const noteId = accessSnap.key
    subscrPromises.push(
      database.ref(`notes/${noteId}`)
      .once('value', (notSnap)=>{
        const notData = notSnap.val()
        const note = { id: notSnap.key, ...notData}
        collectedNotes[note.id] = note
      }, 
      (error) => { 
        console.warn('Note does not exist or no access', error) 
      })
    )
  })

  Promise.all(subscrPromises)
  .then(() => {
    const notesArray = Object.values(collectedNotes)
    ...
  })
  .catch((error) => { console.error(error); return Promise.resolve(true) })

我不希望客户端在permission_denied 上停止!

有没有办法在不引发错误的情况下查看用户是否可以访问节点/notes/no_access_note

亲切的问候 /K

【问题讨论】:

    标签: javascript firebase-realtime-database es6-promise firebase-security


    【解决方案1】:

    我不希望客户端在 permission_denied 时停止!

    您使用的是Promise.all,其中MDN documents 为:

    Promise.all() 将在任何输入承诺被拒绝时立即拒绝。

    您可能想查看Promise.allSettled(),其中MDN documents 为:

    [Promise.allSettled()] 通常用于当您有多个不依赖于彼此才能成功完成的异步任务,或者您总是想知道每个承诺的结果时。


    有没有办法在不引发错误的情况下查看用户是否可以访问节点 /notes/no_access_note?

    据我所知,SDK 总是记录数据访问权限错误,这是无法抑制的。

    尝试访问用户无权访问的数据在 Firebase 中被视为编程错误。在正常操作中,你的代码应该确保它永远不会遇到这样的错误。

    这意味着您的数据访问应该遵循访问它知道可以访问的数据的快乐路径。因此,您存储用户有权访问的笔记列表,然后从该列表访问每个单独的笔记。

    因此,在您的情况下,我建议您找出为什么要尝试阅读用户无权访问的注释,而不是尝试从控制台隐藏消息。


    【讨论】:

    • 嗨弗兰克!谢谢你的回复!我已经修复了创建无效访问节点的功能并实现了检查无效访问节点的功能。将仔细研究 Promise.allSettled()!非常感谢! /K
    猜你喜欢
    • 1970-01-01
    • 2018-05-30
    • 2021-08-10
    • 1970-01-01
    • 2021-02-11
    • 2021-04-03
    • 2017-01-01
    • 2022-01-15
    • 2021-12-04
    相关资源
    最近更新 更多