Как проверить, если пользователь вошел в базу данных C # - PullRequest
2 голосов
/ 06 июня 2019
    void checkOnline()
    {
        string sql = "select * from png_users where username = '" + txtboxUsername.Text + "' and password = '"  + txtboxPassword.Text + "' and userstatus = '1'";
        cm = new MySqlCommand(sql, cn);
        dr = cm.ExecuteReader();
        dr.Read();
        if (dr.HasRows)
        {
            MessageBox.Show("This account is currently online, you forgot to logout. Please approach administrator for help. Thank you", "THD FAM", MessageBoxButtons.OK, MessageBoxIcon.Error);
            dr.Close();
            this.Close();
            return;
        }
    }

Я довольно новичок в базе данных, и я пытаюсь выяснить, как использовать сеансы для проверки и просмотра, если пользователь вошел в базу данных, чтобы у него была авторизация для доступа к определенным страницам.

Спасибо за помощь

1 Ответ

2 голосов
/ 06 июня 2019

По комментариям

Если userstatus равно 0, вы можете использовать учетную запись, и если userstatus = 1 вы не можете получить доступ к учетной записи, потому что кто-то уже использовал это

мы должны проверить на 3 случаи:

  • пользователь / пароль не найден (давайте вернем -1 как userstatus для этого)
  • пользователь владеет учетной записью (userstatus is 0)
  • учетная запись принадлежит другому пользователю (userstatus is 1)

Давайте метод извлечения :

  // -1 Account does't exist 
  //  0 Account exists and belongs to the user
  //  1 Account exists and belongs to different user
  public int UserLogStatus(string login, string password) {
    //DONE: do not reuse connection, but create a new one
    using (var con = new MySqlConnection(ConnectionStringHere)) {
      con.Open();

      //DONE: keep sql readable
      //DONE: make sql parametrized 
      string sql = 
        @"select userstatus
            from png_users 
           where username = @prm_username and
                 password = @prm_password";  

      //DONE: wrap IDisposable into using 
      using (MySqlCommand query = new MySqlCommand(sql, con)) {
        //TODO: better create params explicitly, Parameters.Add(name, type).Value = ...
        query.Parameters.AddWithValue("@prm_username", login);
        query.Parameters.AddWithValue("@prm_password", pasword);

        using (var reader = query.ExecuteReader()) {
          if (reader.Read()) 
            return Convert.ToInt32(reader[0]);
          else
            return -1;
        }
      }
    }
  } 

И тогда вы можете использовать его:

  int status = IsUserLogged(txtboxUsername.Text, txtboxPassword.Text);

  if (status == 0) {
    MessageBox.Show("Either username or password is incorrect.", 
                    "THD FAM", 
                     MessageBoxButtons.OK, 
                     MessageBoxIcon.Error);

    return;
  } 
  else if (status == 1) {
    MessageBox.Show("This account is currently online, you forgot to logout. Please approach administrator for help. Thank you", 
                    "THD FAM", 
                     MessageBoxButtons.OK, 
                     MessageBoxIcon.Error);

    return;
  }

Внимание! Не хранить пароли как обычный текст . Если кто-то украдет стол, все пользователи будут скомпрометированы. Вместо этого сохраните хэши паролей . При входе в систему пользователь должен указать строку (password), такую, что

  HashFunction(password) == StoredHash

, где HashFunction - это односторонняя функция : легко вычислить (т. Е. Легко найти HashFunction(password) значение), трудно повернуть (т. Е. Почти невозможно найти жало такое, что HashFunction(password) == given value)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...