Правило Firebase, разрешающее чтение / запись данных для учителя и ученика - PullRequest
0 голосов
/ 04 мая 2020

Я использую базу данных Firebase для хранения базы данных учеников / учителей. Прямо сейчас мои правила позволяют учителям читать данные своего ученика, вызывая вызываемую функцию, которая предоставляет данные, относящиеся к ученику. (Firebase admin sdk)

Что я пытаюсь сделать -

  1. Разрешить учителям пригласить учащихся добавить их в свой список учеников. Учителя могут отправить приглашение, вызвав http firebase функцию , чтобы отправить приглашение по электронной почте.
  2. Как только ученики нажимают на ссылку приглашения, чтобы принять, они добавляются под учителем, который отправил им приглашение.
  3. После принятия учитель может прочитать данные всех учеников, зарегистрированных под ним, вызвав вызываемую функцию . Вот где у меня проблема. Я могу читать без проблем, но вызов функции каждый раз, когда страница refre sh, будет дорогостоящим, поэтому я решил поиграть с правилами firebase.

Ниже моя структура базы данных Firebase. Как я могу разработать правило базы данных таким образом, чтобы учитель мог читать данные своего ученика, не вызывая вызываемую функцию.

Я обнаружил нечто подобное в этом сообщении stackoverflow -

DATABASE

{
    "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"
      } 
    }
  }
}

1 Ответ

1 голос
/ 04 мая 2020

Вы сохраняете принятых учителей для учителя как:

"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. Так как правила не являются фильтрами , им потребуется доступ к данным каждого учащегося в отдельности.

...