Получение информации о пользователе

Это мой код до сих пор:

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 дополнительных столбца в таблице рядом с записью, которую он сделал.

ну, вместо того, чтобы просто подсчитывать пользователей, сопоставляя свое имя пользователя и нехешированный пароль (чего никогда не следует делать, даже в безопасной локальной среде. и особенно если вы все еще учитесь - выучите это правильно!), вы можете просто SELECT * и прочитать данные?

Franz Gleichmann 15.12.2020 08:25

Вы можете получить имя пользователя или доменное имя пользователя из оконной среды, например, в этом документе «learn.microsoft.com/en-us/dotnet/api/… ». Будем надеяться, что среда вашего ПК и AD правильно настроены.

phonemyatt 15.12.2020 08:25

@FranzGleichmann Спасибо, я пока не очень хорошо разбираюсь в хешированных паролях. Не совсем уверен, как мне реализовать метод SELECT * для поиска вошедшего в систему пользователя, не могли бы вы привести небольшой пример? Environment.UserName дает мне текущего пользователя в Windows, мне нужно захватить пользователя, который в данный момент вошел в систему в моем приложении.

q1werty 15.12.2020 08:32

Сохраните имя пользователя и пароль в справочнике, в чем здесь проблема? Также не забудьте уточнить свои вопросы, иначе люди неправильно их истолковали, и вы получите закрытый дубликат. Я удалил дубликат, который я добавил. Можете ли вы отредактировать вопрос и уточнить, что вам действительно нужно. Я нашел это немного двусмысленным

TheGeneral 15.12.2020 08:33

Я отредактировал вопрос, чтобы было более понятно, что я пытаюсь сделать. Извините, если я что-то неправильно понял, я все еще новичок с формами Windows.

q1werty 15.12.2020 08:49
I know I should use SQL Parameters, but it's a safe local environment. Никаких оправданий. Делайте это правильно, каждый раз. stackoverflow.com/questions/14376473/… stackoverflow.com/questions/1054022/…
mjwills 15.12.2020 08:51
My question is, how can I retrieve info of which user is currently logged in? Они, должно быть, вошли в систему, когда загружали приложение, да? Поэтому сохраните имя пользователя в этой точке в переменной static.
mjwills 15.12.2020 08:52

Спасибо, ребята, это тестовое приложение, поэтому я не беспокоюсь о SQL-инъекциях. Просто пытаюсь узнать что-то новое, попробую как-нибудь разобраться..

q1werty 15.12.2020 08:59
so I'm not worried by SQL injections. Я хочу быть предельно ясным — это не то, как разрабатывать программное обеспечение.
mjwills 15.12.2020 09:02

@mjwills Да, и я полностью согласен с вами в этом, я только что узнал о параметрах и SQL-инъекциях за 10 дней до этого тестового проекта, поэтому я решил, по крайней мере, заставить его работать, прежде чем идти и исправлять каждую ошибку, которую я сделал во время сборки.

q1werty 15.12.2020 09:06
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
10
267
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Знание того, кто вошел в систему

Кто вошел в систему Windows

В случае, если вы имеете в виду, кто вошел в систему, например. на машине с 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;
    
  • аналогично приведенному выше разделу, но с добавлением столбцов «дата удаления» и «удалено кем» (может потребоваться, если все еще возможно изменить что-то, что «неактивно»)

Это действительно хороший ответ, спасибо, Шамин!

q1werty 16.12.2020 08:11

Другие вопросы по теме