Это мой код до сих пор:
private void loginbtn_Click(object sender, EventArgs e)
{
CRUD.cmd = new NpgsqlCommand("SELECT COUNT(*) FROM users WHERE username = '" + txtuser.Text + "' AND password = '" + txtpass.Text + "'", CRUD.con);
NpgsqlDataAdapter da = new NpgsqlDataAdapter();
DataTable dt = new DataTable();
da.SelectCommand = CRUD.cmd;
da.Fill(dt);
if (dt.Rows[0][0].ToString() == "1")
{
Welcome welcome = new Welcome();
welcome.Show();
this.Hide();
}
else
{
MessageBox.Show("Username or password incorrect, try again.",
"Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
txtpass.Clear();
txtuser.Clear();
txtuser.Focus();
}
if (RememberMe.Checked)
{
Properties.Settings.Default.UserName = txtuser.Text;
Properties.Settings.Default.Password = txtpass.Text;
Properties.Settings.Default.Save();
}
}
Я знаю, что должен использовать параметры SQL, но это безопасная локальная среда. Мой вопрос: как я могу получить информацию о том, какой пользователь в настоящее время вошел в систему? Мне это нужно, поэтому, когда пользователь выполняет метод INSERT для таблицы SQL, я хочу знать, какой пользователь сделал запись или какой пользователь удалил ее. Также добавить эту информацию о пользователях вместе с остальной частью метода INSERT в 2 дополнительных столбца (USER ID AND PASS).
Редактировать:
Здесь у меня есть небольшое приложение формы окна с представлением данных (DGV) и несколькими текстовыми полями для вставки значений в таблицу с помощью кнопки, а затем отображения этой информации в DGV с возможностью удаления строк. Я сделал Form2, поэтому пользователь должен войти в систему, прежде чем он получит доступ к Form1 (форма DGV). Все, что я хочу сделать, это каким-то образом сохранить информацию об этом пользователе и всякий раз, когда он вносит изменения в DGV, добавлять свои учетные данные в 2 дополнительных столбца в таблице рядом с записью, которую он сделал.
Вы можете получить имя пользователя или доменное имя пользователя из оконной среды, например, в этом документе «learn.microsoft.com/en-us/dotnet/api/… ». Будем надеяться, что среда вашего ПК и AD правильно настроены.
@FranzGleichmann Спасибо, я пока не очень хорошо разбираюсь в хешированных паролях. Не совсем уверен, как мне реализовать метод SELECT * для поиска вошедшего в систему пользователя, не могли бы вы привести небольшой пример? Environment.UserName дает мне текущего пользователя в Windows, мне нужно захватить пользователя, который в данный момент вошел в систему в моем приложении.
Сохраните имя пользователя и пароль в справочнике, в чем здесь проблема? Также не забудьте уточнить свои вопросы, иначе люди неправильно их истолковали, и вы получите закрытый дубликат. Я удалил дубликат, который я добавил. Можете ли вы отредактировать вопрос и уточнить, что вам действительно нужно. Я нашел это немного двусмысленным
Я отредактировал вопрос, чтобы было более понятно, что я пытаюсь сделать. Извините, если я что-то неправильно понял, я все еще новичок с формами Windows.
I know I should use SQL Parameters, but it's a safe local environment.
Никаких оправданий. Делайте это правильно, каждый раз. stackoverflow.com/questions/14376473/… stackoverflow.com/questions/1054022/…My question is, how can I retrieve info of which user is currently logged in?
Они, должно быть, вошли в систему, когда загружали приложение, да? Поэтому сохраните имя пользователя в этой точке в переменной static
.
Спасибо, ребята, это тестовое приложение, поэтому я не беспокоюсь о SQL-инъекциях. Просто пытаюсь узнать что-то новое, попробую как-нибудь разобраться..
so I'm not worried by SQL injections.
Я хочу быть предельно ясным — это не то, как разрабатывать программное обеспечение.
@mjwills Да, и я полностью согласен с вами в этом, я только что узнал о параметрах и SQL-инъекциях за 10 дней до этого тестового проекта, поэтому я решил, по крайней мере, заставить его работать, прежде чем идти и исправлять каждую ошибку, которую я сделал во время сборки.
В случае, если вы имеете в виду, кто вошел в систему, например. на машине с Windows вы можете использовать что-то вроде Environment.UserName
.
Если это ваше собственное решение/база данных для «входа», вам нужно будет добавить эту функцию.
Обычно это делается на собственном сервере с известными библиотеками, а не «пишется от руки», но для грубого/небезопасного примера для вашего тестового проекта вы можете использовать Properties.Settings
, например:
/* "Logging in" */
if (password == databaseUser.Password) {
Properties.Settings.Default.myLoggedInUserId = databaseUser.Id;
Properties.Settings.Default.myLoggedInUserName = databaseUser.Name;
}
/* "Logging out" */
Properties.Settings.Default.myLoggedInUserId = null;
Properties.Settings.Default.myLoggedInUserName = null;
Часто это реализуется путем добавления в таблицу дополнительных полей, например. CreatedDate
и CreatedBy
:
var sqlText = "INSERT INTO MyTableName(Name, CreationDate, CreatedBy) VALUES (@Name, @CreatedDate, @CreatedBy);";
var command = new SqlCommand(sqlText, connection);
command.Parameters.Add("@Name", name);
command.Parameters.Add("@CreatedDate", DateTime.UtcNow);
command.Parameters.Add("@CreatedBy", myLoggedInUserName);
Для того, кто редактировал строку, учитывайте столбцы «дата изменения» и «кто изменил».
Это может быть сделано либо:
вручную INSERT
переход в другую таблицу после успешного выполнения действия (что, похоже, у вас есть)
DELETE FROM Users WHERE UserId = @UserId;
INSERT INTO MyLoggingTable(LogMessage, LoggedInUserId)
VALUES(@Message, @LoggedInUserId);
в сочетании со столбцами «дата изменения»/«изменено кем», как указано выше, с использованием «обратимого удаления», которое удаляет путем установки свойства, а не SQL DELETE
, например users.Active
:
--List all active users
SELECT * FROM users WHERE users.Active = 1;
--Delete a user
UPDATE users SET Active = 0 WHERE UserId = @UserId;
--Who deleted a user (assuming you can't edit a deleted user)
SELECT users.ModifiedBy FROM users WHERE users.UserId = @Id;
аналогично приведенному выше разделу, но с добавлением столбцов «дата удаления» и «удалено кем» (может потребоваться, если все еще возможно изменить что-то, что «неактивно»)
Это действительно хороший ответ, спасибо, Шамин!
ну, вместо того, чтобы просто подсчитывать пользователей, сопоставляя свое имя пользователя и нехешированный пароль (чего никогда не следует делать, даже в безопасной локальной среде. и особенно если вы все еще учитесь - выучите это правильно!), вы можете просто
SELECT *
и прочитать данные?