簡體   English   中英

如何使用JavaScript在Firebase中將在線用戶的狀態更改為離線用戶

[英]How to change status of online user to offline user in firebase using javascript

我正在使用Firebase數據庫制作程序。 許多用戶使用Android手機連接到數據庫並回答了一些問題。 如果用戶回答不正確,那么我想斷開該用戶與Firebase數據庫的連接。 更准確地說,有10個用戶連接到Firebase,並從表中提問,然后回答所有問題,其中4個回答不正確。 我想從游戲中踢掉這4個用戶。 在firebase中可能嗎? 我看到了onDisconnect()函數,但我不知道它是否有效。 請幫我

您希望回答錯誤的用戶不能添加更多數據。 斷開用戶與RTD的連接似乎是一種方法,但是考慮到不安全,這似乎是一個太多的問題。

我建議您:

  1. 創建一組規則,以防止惡意客戶端在錯誤答案后繼續添加數據
  2. 具有適合您目的的RTD結構
  3. 使用功能安全地控制業務邏輯
  4. 使客戶反映在用戶界面上

規則應類似於:如果用戶在與當前游戲具有相同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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM