Оказывается, я уже выбрал некоторые элементы для обзора, прежде чем я правильно понял процесс, поэтому я оказался в состоянии неспособности сделать приложение вживую, поскольку у меня были ожидающие элементы обзора. Я удалил разрешения из очереди просмотра, сделал приложение вживую, и все хорошо.
Вы хотите, чтобы пользователи, которые ответили неправильно, не могли добавлять больше данных. Отключение пользователя от RTD выглядит как способ сделать это, но кажется слишком большой проблемой, учитывая, что это небезопасно.
Я рекомендую:
Правила должны выглядеть примерно так: если пользователь имеет значение true на узле проверки с тем же идентификатором, что и в текущей игре, пользователь может написать ответы, если узел проверки ложен, тогда пользователь ошибочно ответил на предыдущий вопрос и, следовательно, не может написать больше ответов. Мы вернемся к этому.
Ваша структура базы данных должна выглядеть примерно так:
{
"questionnaires": {
"questionnaire_id_1": {
"question_1": {
"question": "How much is 2 + 2",
"alternatives": {
"a": 4,
"b": 3,
"c": 2
}
},
"question_2": {
"question": "How much is 0 + 2",
"alternatives": {
"a": 4,
"b": 3,
"c": 2
}
}
}
},
"answers": {
"questionnaire_id_1": {
"question_1": "a",
"question_2": "c"
}
},
"user_answers": {
"questionnaire_id_1": {
"uid_1": {
"question_1": "a",
"question_2": "c"
},
"uid_2": {
"question_1": "a",
"question_2": "c"
},
"uid_3": {
"question_1": "a"
}
}
},
"questionnaires_permissions": {
"questionnaire_id_1": {
"uid_1": true,
"uid_2": true,
"uid_3": false
},
"questionnaire_id_2": {
"uid_1": true,
"uid_2": true,
"uid_3": true
}
}
}
Есть questionnaires
для выбора пользователя. Когда пользователь выбирает вопросник, он запускает функцию onCall Firebase , которая будет проверять, если пользователь ранее выбрал вопросник. Функция onCall проверит, существует ли questionnaires_permissions/{user_uid}
. Если он не существует, он ответит ok move forward
и создаст его, если он существует и является истинным, то он также ответит и ok move forward
, но если он ложный, это означает, что пользователь ранее допустил ошибку, тогда это будет ответ user failed the test
. Таким образом, пользовательский интерфейс может отражать то, что в первый раз выбирает анкету или вводит ее заново.
Узлы questionnaires
позволяют пользователю читать все вопросы, узел answers
имеет правильные ответы, доступные только для чтения функциями, а узел user_answers
имеет фактические ответы пользователя (написанные пользователем). ).
Для создания users_answers/{questionnaire_id}/{uid}/{question}
необходим слушатель RTD Functions . Когда пользователь создает ответ, функции срабатывают и проверяют правильность ответа. Если он неверен, он будет помечен как false
на узле questionnaires_permissions/{questionnaire_id}/{uid}
.
Клиент должен иметь прослушиватель в режиме реального времени для questionnaires_permissions/{questionnaire_id}/{uid}
, если он меняется на false, тогда пользовательский интерфейс должен отображать предупреждение, сообщающее пользователю, что последний вопрос был неверным.
Последние 2 шага также могут быть одной операцией с использованием onCall
.
Теперь мы должны взглянуть на правила базы данных.
{
"rules": {
"questionnaires": {
".read": "auth != null",
".write": false
},
"answers": {
".read": false,
".write": false
},
"user_answers": {
"$questionnaire_id": {
"$uid": {
"$question_id": {
".read": false,
".write": "$uid === auth.uid && root.child('questionnaires_permissions').child($questionnaire_id).val() == true"
}
}
}
},
"questionnaires_permissions": {
"$questionnaire_id": {
"$uid": {
".read": "$uid === auth.uid",
".write": false
}
}
}
}
}
Так что, если по какой-либо причине клиент malicios попытается написать после неправильного ответа, это будет невозможно, потому что правила базы данных не позволят этого