我正在使用 firebase 数据库制作一个程序。许多用户使用 Android 手机连接数据库并回答一些问题。如果用户回答不正确,那么我想断开该用户与 firebase 数据库的连接。更准确地说,10 个用户连接到 firebase 并从表中提取问题,然后回答一个问题,其中 4 个用户回答错误。我想把这 4 个用户踢出游戏。在 firebase 中可能吗?我看到了 onDisconnect() 函数,但我不知道它是否有效。请帮助我
最佳答案
您希望回答错误的用户无法添加更多数据。 断开用户与 RTD 的连接似乎是一种方法,但考虑到不安全,这似乎是一个太大的问题。
我的建议是:
- 创建一组规则,防止恶意客户端继续 在错误答案后添加数据
- 拥有适合的 RTD 结构 你的目的
- 使用函数安全地控制业务逻辑
- 让客户反射(reflect)用户界面正在发生的事情
规则应该是这样的:如果用户在与当前游戏具有相同 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
}
}
}
有调查问卷
供用户选择。当用户选择调查问卷时,它将触发 onCall Firebase Function这将验证用户之前是否选择过调查问卷。 onCall 函数将检查 questionnaires_permissions/{user_uid}
是否存在。如果它不存在,它将回复确定前进
并创建它,如果它确实存在并且为真,那么它也会响应并确定前进
,但是如果为 false,则表示用户之前犯了一个错误,那么它将响应 user failed the test
。这样,用户界面可以反射(reflect)第一次选择调查问卷或重新输入调查问卷时的情况。
questionnaires
节点允许用户阅读所有问题,answers
节点具有可供函数只读的正确答案,user_answers
节点有用户实际答案(由用户编写)。
您需要有一个 RTD Functions listener用于创建users_answers/{questionnaire_id}/{uid}/{question}
。当用户创建答案时,功能将被触发并检查它是否是正确的答案。如果不正确,则会在 questionnaires_permissions/{questionnaire_id}/{uid}
节点上标记为 false
。
客户端必须有一个针对 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
}
}
}
}
}
因此,如果恶意客户端出于任何原因尝试在错误答案后写入,则这是不可能的,因为数据库规则不允许这样做
关于javascript - 如何使用javascript在firebase中将在线用户的状态更改为离线用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54215716/