我正在使用Firebase数据库制作程序。许多用户使用Android手机连接到数据库并回答了一些问题。如果用户回答不正确,那么我想断开该用户与Firebase数据库的连接。更准确地说,有10个用户连接到Firebase,并从表中提问,然后回答所有问题,其中4个回答不正确。我想从游戏中踢掉这4个用户。在firebase中可能吗?我看到了onDisconnect()函数,但我不知道它是否有效。请帮助我
答案 0 :(得分:1)
您希望回答错误的用户不能添加更多数据。 断开用户与RTD的连接似乎是一种方法,但是考虑到不安全,似乎有太多问题。
我建议这样做:
规则应类似于:如果用户在与当前游戏具有相同ID的验证节点上为true,则用户可以编写答案(如果验证节点为false),则用户错误地回答了先前的问题,因此无法写出更多答案。我们会回来的。
您的数据库结构应如下所示:
{
"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 Function,该RTD Functions listener会验证用户先前是否选择了问卷。 onCall函数将检查questionnaires_permissions/{user_uid}
是否存在。如果它不存在,它将回复ok move forward
并创建它;如果它确实存在并且为真,则它也将做出响应,并且ok move forward
也将做出响应,但是如果它为false,则表示用户先前已经创建了错误,它将回复user failed the test
。这样,用户界面可以反映出第一次选择问卷或重新输入问卷时的情况。
questionnaires
节点允许用户阅读所有问题,answers
节点具有正确的答案,以被Functions只读,而user_answers
节点则具有用户实际的答案(由用户编写)。
创建users_answers/{questionnaire_id}/{uid}/{question}
时需要一个{{3}}。当用户创建答案时,将触发功能并检查其是否正确。如果不正确,则会在false
节点上将其标记为questionnaires_permissions/{questionnaire_id}/{uid}
。
如果questionnaires_permissions/{questionnaire_id}/{uid}
更改为false,则客户端必须具有实时侦听器,然后UI必须显示警告,告诉用户最后一个问题是错误的。
最后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客户端尝试在错误的答案后进行写操作,则将无法执行,因为数据库规则不允许这样做