javascript - 如何使用javascript在firebase中将在线用户的状态更改为离线用户
问题描述
我正在使用 firebase 数据库制作程序。许多用户使用安卓手机连接到数据库并回答一些问题。如果用户回答错误,那么我想断开该用户与 firebase 数据库的连接。更准确地说,有 10 个用户连接到 firebase 并从表中提出问题,然后回答一个问题,其中 4 个回答错误。我想把这 4 个用户踢出游戏。在火力基地有可能吗?我看到了 onDisconnect() 函数,但我不知道它是否有效。请帮我
解决方案
您希望回答错误的用户无法添加更多数据。断开用户与 RTD 的连接似乎是一种方法,但考虑到不安全,这似乎是一个太大的问题。
我的建议是:
- 创建一组规则,防止恶意客户端在错误答案后继续添加数据
- 拥有适合您目的的 RTD 结构
- 使用 Functions 安全地控制业务逻辑
- 让客户在 UI 上反映正在发生的事情
规则应该是这样的:如果用户在与当前游戏具有相同 id 的验证节点上为真,则用户可以编写答案,如果验证节点为假,则用户错误地回答了前一个问题,因此不能写更多的答案。我们会回来的。
你的数据库结构应该是这样的:
{
"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
节点有用户实际答案(由用户编写)。
您需要有一个RTD 函数侦听器来users_answers/{questionnaire_id}/{uid}/{question}
创建。当用户创建答案时,函数将被触发并检查它是否是正确的答案。如果不正确,则将其标记为false
在questionnaires_permissions/{questionnaire_id}/{uid}
节点上。
客户端必须有一个实时监听器,questionnaires_permissions/{questionnaire_id}/{uid}
如果它变为 false,那么 UI 必须显示警告,告诉用户最后一个问题是错误的。
最后两个步骤也可以是使用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 客户端尝试在错误答案后写入,这是不可能的,因为数据库规则不允许这样做
推荐阅读
- vue.js - 如何专注于 vuejs 中的 v-for 中的输入
- python - 在 tkinter 树视图中合并节点
- python - 如何为 sklearn 多类 ROC-AUC 分数使用不同的标签顺序?
- php - 诗篇检查“死亡”的呼唤
- reactjs - 根据使用的语言更改密钥
- json - 转换json对象时找不到类型转换器?
- terraform - terraform 如何确定何时下载模块?
- jsf - 在托管 bean 上执行资源注入时发生错误
- floating-point - 如何在单精度浮点中无偏差地转换负指数
- javascript - 使用 JavaScript addEventListener 到按钮