【问题标题】:Firebase rule to allow data read/write for a teacher and studentFirebase 规则允许教师和学生读取/写入数据
【发布时间】:2020-08-19 00:12:15
【问题描述】:

我正在使用 Firebase 数据库来存储学生/教师数据库。现在我的规则允许教师通过调用提供与学生相关数据的可调用函数来读取学生的数据。 (Firebase 管理员 SDK)

我想做什么 -

  1. 允许教师邀请学生将他们添加到他的学生列表下。教师可以通过调用 http firebase 函数发送邀请,通过电子邮件发送邀请。
  2. 一旦学生点击邀请链接接受,他们就会被添加到向他们发送邀请的老师的下方。
  3. 接受后,教师可以通过调用可调用函数来读取他注册的所有学生的数据。这是我有问题的地方。我可以毫无问题地正确阅读,但每次刷新页面时调用一个函数会很昂贵,因此我决定使用 firebase 规则。

以下是我的 firebase 数据库结构。如何设计数据库规则,使教师无需调用可调用函数即可读取学生数据。

我在stackoverflow post 上发现了类似的东西 -

数据库

{
    "teachers":
    {
        "teacher-unique-id":
        {
            "invited":
            {
                "auto-gen-key-id": "student-email-id-1",
                "auto-gen-key-id": "student-email-id-2",
                "auto-gen-key-id": "student-email-id-3",
                "auto-gen-key-id": "student-email-id-4",
                "auto-gen-key-id": "student-email-id-5",
            },
            "accepted":
            {
                "auto-gen-key-id": "unique-student-id-1",
                "auto-gen-key-id": "unique-student-id-2",
                "auto-gen-key-id": "unique-student-id-3",
            }
        }
    },
    "students":
    {
        "unique-student-id-1":
        {
            "session-id-1":
            {
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
            },
            "session-id-2":
            {
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
            }
        },
        "unique-student-id-2":
        {
            "session-id-1":
            {
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
            },
            "session-id-2":
            {
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
                "auto-gen-key-id": "data",
            }
        }
    }
}

Firebase 规则 - 这基本上是我使用的默认规则。如何修改它们以实现我想要实现的目标?

 {
  /* Visit https://firebase.google.com/docs/database/security to learn more about security rules. */
  "rules": {
    "teachers":{
      "$uid":{
        "studentsId":{
          ".read": "$uid===auth.uid", 
        }
      }
    },
    "students":{
      "$uid":{
        ".read": "$uid===auth.uid",
            ".write": "$uid===auth.uid"
      } 
    }
  }
}

【问题讨论】:

    标签: firebase firebase-realtime-database firebase-security


    【解决方案1】:

    您将接受的学生存储为:

    "teachers": {
      "teacher-unique-id": {
        "accepted": {
          "auto-gen-key-id": "unique-student-id-1",
          "auto-gen-key-id": "unique-student-id-2",
          "auto-gen-key-id": "unique-student-id-3",
        }
      }
    },
    

    问题在于,使用这种结构,您需要搜索accepted 下的所有值以了解老师是否认识学生,而您无法在安全规则中搜索。所以我建议将数据存储为:

    "teachers": {
      "teacher-unique-id": {
        "accepted": {
          "unique-student-id-1": true, 
          "unique-student-id-2": true, 
          "unique-student-id-3": true, 
        }
      }
    },
    

    使用该结构,您可以允许教师读取已接受他们的学生的数据:

    {
      "rules": {
        ...
        "students":{
          "$uid":{
            ".read": "$uid===auth.uid || 
                   root.child('teachers').child(auth.uid).child('accepted').child($uid).exists()",
            ".write": "$uid===auth.uid"
          } 
        }
      }
    }
    

    请注意,这将授予教师访问/student/$studentid 的权限,而不是授予/students 的访问权限。由于rules are not filters,他们需要单独访问每个学生的数据。

    【讨论】:

    • van Pufflelen - 我知道我应该单独问这个问题,但我想先试试你的建议,然后再去 stackoverflow。我的问题是 - 如何将我的云函数拆分为单独的文件并传递函数和 firebase 对象以使其可以从其他文件访问?我不想在我拆分的每个文件中都做要求。还在每个文件中初始化 firebase.initializeApp() ,相互冲突并抛出错误。你有最佳实践建议吗?我已经研究了一些 stackoverflow 问题,但它们太令人困惑了。
    • 如果我需要扩大规模,我通常会像节点模块一样编写单独的文件,而不依赖于 Cloud Functions。然后在我的主要index.js 中,我包含/需要所有这些“模块”,并且只有它们的 Cloud Functions 包装器。
    • 我确实拆分了我的代码。我认为这与我以前在 nodejs 中创建单独的模块不同。无论如何,我有一个小问题,“应该”我使用 firebase 创建实时聊天应用程序吗?我已经阅读了几个博客和 stackoverflow 问题,现在我很困惑。你能给我建议吗?
    • 技术建议与 Stack Overflow 无关。但正如您的搜索可能显示的那样,有数百个教程介绍了如何使用 Firebase 实时数据库构建聊天应用。
    • 很抱歉,我知道,但我只是想征求您的意见,因为您是 Firebase 技术的工程师,所以我想谁更适合直接回答这个话题。我只是想知道它是否是一个很好的技术堆栈来继续开发聊天应用程序。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-08-12
    • 2019-03-12
    • 2020-07-11
    • 1970-01-01
    • 2018-01-05
    • 1970-01-01
    • 2020-03-22
    • 1970-01-01
    相关资源
    最近更新 更多