Привет, я работаю над формой входа на уровне пользователя. У каждой учетной записи есть два типа уровня пользователя. A и B, где в A - администратор, а B - сотрудник. Кажется, я не могу правильно войти в систему, потому что я все еще могу войти в форму, используя учетную запись сотрудника. Пожалуйста, посмотрите мой код.
private bool validate_login(string user, string pass, string pos) //sql check
{
db_connection();
MySqlCommand cmd = new MySqlCommand();
cmd.CommandText = "SELECT * FROM login WHERE Username=@user AND Password=@pass GROUP BY Position=@Position";
cmd.Parameters.AddWithValue("@user", user);
cmd.Parameters.AddWithValue("@pass", pass);
cmd.Parameters.AddWithValue("@Position", pos);
cmd.Connection = connect;
MySqlDataReader login = cmd.ExecuteReader();
if (login.Read())
{
connect.Close();
return true;
}
else
{
connect.Close();
return false;
}
}
private void login_Click(object sender, EventArgs e) //LOGIN
{
try
{
string user = textBox1.Text;
string pass = textBox2.Text;
string pos = "A";
if (user == "" || pass == "")
{
MessageBox.Show("Did you input something? I doubt it.");
return;
}
bool r = validate_login(user, pass, pos);
/*bool s = validate_pos(pos);*/
if (r)
{
newMainMenu nmm = new newMainMenu();
nmm.Show();
this.Hide();
logs.LogThatShit_LogIn();
}
else
{
MessageBox.Show("Wrong username and/or password!", "Login", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
catch (MySqlException e2)
{
MessageBox.Show(e2.Message);
}
}
Я перепробовал много запросов, но все еще не могу ответить. Подскажите, пожалуйста, что не так? Спасибо.
Нет кода, который проверяет тип пользователя. Без этого не получится
Я пытаюсь указать в запросе выбрать имя пользователя и пароль только с позицией A. Я пробовал SELECT * FROM login WHERE Username = "admin", Password = "1234", Position = "A", но это дает мне синтаксическую ошибку SQL.
Если я не ошибаюсь, GROUP BY Position=@Position будет просто группироваться по TRUE / FALSE в зависимости от того, входит ли пользователь в указанную группу. В этом нет большого смысла.
попробуйте следовать этому: stackoverflow.com/questions/19546906/…, вы пытались использовать счетчик в запросе sql?
@NoxEternal Хорошо, тогда объедините свои условия с AND - как вы бы сделали на любом языке и уже сделали с именем пользователя и паролем.
@NoxEternal Это потому, что это должен быть WHERE Username=@Username AND Password=@Password AND Position=@Position ... не говоря уже о проблеме безопасности пароля в виде открытого текста
Вместо Group BY введите WHERE Username = @ user AND Password = @ pass AND Position=@Position
@CamiloTerevinto попробует сейчас
@CamiloTerevinto сработало !! Пожалуйста, опубликуйте свой ответ, чтобы я мог отметить его. Большое спасибо!!
Опасность. Вы храните свои пароли в нехешированном (незашифрованном) виде. Если вы это сделаете, ваше приложение будут будет взломано. Сеть кишит ботами киберпреступников, которые ищут небезопасные сайты. Пожалуйста, не придумывайте собственную проверку пароля. В Dotnet есть несколько хороших примеров / шаблонов для правильного выполнения этой задачи.





cmd.CommandText = "SELECT * FROM login WHERE Username=@user AND Password=@pass GROUP BY Position=@Position";
напишите пожалуйста Position=@pos
Что должен делать этот
GROUP BY? Почему вы не добавляете позицию в фильтр?