首页 > 解决方案 > 如何使用javascript在firebase中将在线用户的状态更改为离线用户

问题描述

我正在使用 firebase 数据库制作程序。许多用户使用安卓手机连接到数据库并回答一些问题。如果用户回答错误,那么我想断开该用户与 firebase 数据库的连接。更准确地说,有 10 个用户连接到 firebase 并从表中提出问题,然后回答一个问题,其中 4 个回答错误。我想把这 4 个用户踢出游戏。在火力基地有可能吗?我看到了 onDisconnect() 函数,但我不知道它是否有效。请帮我

标签: javascriptfirebase

解决方案


您希望回答错误的用户无法添加更多数据。断开用户与 RTD 的连接似乎是一种方法,但考虑到不安全,这似乎是一个太大的问题。

我的建议是:

  1. 创建一组规则,防止恶意客户端在错误答案后继续添加数据
  2. 拥有适合您目的的 RTD 结构
  3. 使用 Functions 安全地控制业务逻辑
  4. 让客户在 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}创建。当用户创建答案时,函数将被触发并检查它是否是正确的答案。如果不正确,则将其标记为falsequestionnaires_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 客户端尝试在错误答案后写入,这是不可能的,因为数据库规则不允许这样做


推荐阅读