如何使用JavaScript在Firebase中将在线用户的状态更改为离线用户

时间:2019-01-16 11:06:23

标签: javascript firebase

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

1 个答案:

答案 0 :(得分:1)

您希望回答错误的用户不能添加更多数据。 断开用户与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 Function,该RTD Functions listener会验证用户先前是否选择了问卷。 onCall函数将检查questionnaires_permissions/{user_uid}是否存在。如果它不存在,它将回复ok move forward并创建它;如果它确实存在并且为真,则它也将做出响应,并且ok move forward也将做出响应,但是如果它为false,则表示用户先前已经创建了错误,它将回复user failed the test。这样,用户界面可以反映出第一次选择问卷或重新输入问卷时的情况。

questionnaires节点允许用户阅读所有问题,answers节点具有正确的答案,以被Functions只读,而user_answers节点则具有用户实际的答案(由用户编写)。

创建users_answers/{questionnaire_id}/{uid}/{question}时需要一个{{3}}。当用户创建答案时,将触发功能并检查其是否正确。如果不正确,则会在false节点上将其标记为questionnaires_permissions/{questionnaire_id}/{uid}

如果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客户端尝试在错误的答案后进行写操作,则将无法执行,因为数据库规则不允许这样做