[英]How to change status of online user to offline user in firebase using javascript
我正在使用Firebase數據庫制作程序。 許多用戶使用Android手機連接到數據庫並回答了一些問題。 如果用戶回答不正確,那么我想斷開該用戶與Firebase數據庫的連接。 更准確地說,有10個用戶連接到Firebase,並從表中提問,然后回答所有問題,其中4個回答不正確。 我想從游戲中踢掉這4個用戶。 在firebase中可能嗎? 我看到了onDisconnect()函數,但我不知道它是否有效。 請幫我
您希望回答錯誤的用戶不能添加更多數據。 斷開用戶與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函數 ,該函數將驗證用戶先前是否選擇了調查表。 onCall函數將檢查是否存在surveys_permissions questionnaires_permissions/{user_uid}
。 如果它不存在,它將回復ok move forward
創建它;如果它確實存在並且為真,則它將做出響應並也可以ok move forward
,但是如果它不成立,則意味着用戶先前犯了一個錯誤,然后它將響應user failed the test
。 這樣,UI可以反映出第一次選擇調查表或重新輸入調查表的內容。
questionnaires
節點允許用戶閱讀所有問題, answers
節點具有正確的答案(按功能是只讀的),而user_answers
節點具有用戶的實際答案(由用戶編寫)。
您需要具有用於users_answers/{questionnaire_id}/{uid}/{question}
的RTD功能偵聽器。 當用戶創建答案時,將觸發功能並檢查其是否正確。 如果不正確,則會在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
}
}
}
}
}
因此,如果由於某種原因malicios客戶端嘗試在錯誤的答案后進行寫操作,那么這將是不可能的,因為數據庫規則不允許這樣做
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.