40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
1

Как сделать роль в коде программы?

29.09.2021, 16:44. Показов 4279. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как сделать роль в коде программы, чтобы при регистрации пользователю выдавалась роль, помогите пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2021, 16:44
Ответы с готовыми решениями:

Как сделать дешифровку шифра Атбаш? Что нужно изменить в коде программы?
alf2="" key=input() for i in range(len(key)): if (alf2.find(key)) == -1: alf2+=key...

Как сделать что бы можно было вводить текст, а не задавать в коде программы?
Как сделать что бы можно было вводить текст, а не задавать в коде программы? #include <string.h>...

Как сделать в коде программы, чтобы можно было вводить числа самому, а не случайно. (Код прилагается)
Доброго времени суток. Хочу узнать, как можно сделать вместо случайного ввода чисел заданый ввод....

Как сделать, чтобы в Windows XP роль мыши исполнял джойстик ?
Помогите найти инфу , с помощью какой проги возможно настроить джойстик , как мышь . т.е. чтобы в...

36
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
29.09.2021, 23:11 21
Author24 — интернет-сервис помощи студентам
Ответьте честно, Вы понимаете что тут написано?
C#
1
2
3
4
5
6
MySqlCommand command = new MySqlCommand("INSERT INTO `вata` (`login`, `pass`, `name`, `surname`) VALUES (@login, @pass, @name, @surname)", db.GetConnection());
 
            command.Parameters.Add("@login", MySqlDbType.VarChar).Value = loginField.Text;
            command.Parameters.Add("@pass", MySqlDbType.VarChar).Value = passField.Text;
            command.Parameters.Add("@name", MySqlDbType.VarChar).Value = userNameField.Text;
            command.Parameters.Add("@surname", MySqlDbType.VarChar).Value = userSurnameField.Text;
0
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
29.09.2021, 23:16  [ТС] 22
ipsorokin, Я как понимаю в БД мне ещё нужно добавить столбик role?

Добавлено через 4 минуты
ipsorokin, В таблице есть четыре параметра, дальше в форме у меня есть четыре строки, когда я их заполняю и регистрируюсь, то данные заполненные в строках переходят по данным параметрам в БД
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
29.09.2021, 23:27 23
Цитата Сообщение от goodrogrammer Посмотреть сообщение
В таблице есть четыре параметра, дальше в форме у меня есть четыре строки, когда я их заполняю и регистрируюсь, то данные заполненные в строках переходят по данным параметрам в БД
Да, это делает INSERT.
Следовательно, чтобы добавить еще что-то надо ...? Чтобы был в таблице нужный столбец и передавать еще один параметр.
Который, в данном случае, пусть содержит название роли или в виде цифры, не важно.
Если регистрируете Вы, то сразу все это при регистрации и передаем.
Если не Вы, тогда ставим по умолчанию роль обычного пользователя.

Как понять какая роль у пользователя?
После входа мы смотрим на роль пользователя, который вошел (берем ее из той же строки, что возвращает запрос SELECT c помощью ExecuteReader),
а дальше уже сравниваем через if или case, и, например, блокируем кнопку редактирования, если пользователь не админ.
0
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
29.09.2021, 23:38  [ТС] 24
ipsorokin, Я всё внимательно прочитал, но как мне реализовать это всё?

Добавлено через 4 минуты
ipsorokin, Возможно ли это сделать сегодня?

Добавлено через 57 секунд
ipsorokin, Я вот сделал вот так вот и бд добавил role столбец
C#
1
MySqlCommand command = new MySqlCommand("INSERT INTO `вata` (`login`, `pass`, `name`, `surname`, `Role`) VALUES (@login, @pass, @name, @surname, @Role)", db.GetConnection());
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
29.09.2021, 23:39 25
Понятно... Хотите чтоб за Вас всё сделали.
Вот вам ПРИМЕР, дальше по аналогии
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
        public class User
        {
            public int Id { get; set; }
            public int RoleId { get; set; }
        }
 
        enum Role
        {
            Admin = 2,
            User = 1
        }
 
        public void Login()
        {
            SqlCommand cmd = new SqlCommand("SELECT * FROM Users WHERE Login=@lgn  AND Password=@pwd", connection);
            cmd.Parameters.AddWithValue("@lgn", "User1234556");
            cmd.Parameters.AddWithValue("@pwd", "User1234556");
            SqlDataReader result = cmd.ExecuteReader();
 
            User user = new User();
            while (result.Read())
            {
                user.Id = Convert.ToInt32(result["Id"]);
                user.RoleId = Convert.ToInt32(result["RoleId"]);
            }
 
            if (user.RoleId == (int)Role.User)
                Console.WriteLine("Обычный пользователь");
            if (user.RoleId == (int)Role.Admin)
                Console.WriteLine("Админ");
        }
0
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
30.09.2021, 00:00  [ТС] 26
ipsorokin, А я и не могу сам сделать, потому что не знаю c#, поэтому и прошу помощи

Добавлено через 1 минуту
ipsorokin, И куда это вписывать нужно?

Добавлено через 9 секунд
ipsorokin, В форму входа?

Добавлено через 17 минут
ipsorokin, Я не понимаю, только если вот так вот сделал, но ошибка в коннекте
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
{
    public partial class Form1 : Form
    {
        
        public Form1()
        {
            InitializeComponent();
        }
 
        public class User
        {
            public int Id { get; set; }
            public int RoleId { get; set; }
        }
 
        enum Role
        {
            Admin = 2,
            User = 1
        }
 
        public void Login()
        {
            MySqlCommand command = new MySqlCommand("SELECT * FROM `вata` WHERE `login` = @uL AND `pass` = @uP", connection.MySqlConnection());
            command.Parameters.Add("@uL", MySqlDbType.VarChar).Value = loginUser;
            command.Parameters.Add("@uP", MySqlDbType.VarChar).Value = passUser;
            MySqlDataReader result = command.ExecuteReader();
 
            User user = new User();
            while (result.Read())
            {
                user.Id = Convert.ToInt32(result["Id"]);
                user.RoleId = Convert.ToInt32(result["RoleId"]);
            }
 
            if (user.RoleId == (int)Role.User)
                Console.WriteLine("Обычный пользователь");
            if (user.RoleId == (int)Role.Admin)
                Console.WriteLine("Админ");
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
 
            String loginUser = loginField.Text;
            String passUser = passField.Text;
 
            DB db = new DB();
 
            DataTable table = new DataTable();
 
            MySqlDataAdapter adapter = new MySqlDataAdapter();
 
            MySqlCommand command = new MySqlCommand("SELECT * FROM `вata` WHERE `login` = @uL AND `pass` = @uP", db.GetConnection());
            command.Parameters.Add("@uL", MySqlDbType.VarChar).Value = loginUser;
            command.Parameters.Add("@uP", MySqlDbType.VarChar).Value = passUser;
 
            adapter.SelectCommand = command;
            adapter.Fill(table);
 
 
            if (table.Rows.Count > 0)
            {
                this.Hide();
                Form2 Form2 = new Form2();
                Form2.Show();
            }
            else
                MessageBox.Show("Вы не ввели логин или пароль");
 
 
        }
 
        private void button3_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void button2_Click(object sender, EventArgs e)
        {
            Регистрация newfrm = new Регистрация();
            newfrm.Show();
            this.Hide();
        }
 
        private void button4_Click(object sender, EventArgs e)
        {
            Form3 newfrm = new Form3();
            newfrm.Show();
            this.Hide();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
 
        }
    }
}
0
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
30.09.2021, 19:02  [ТС] 27
ipsorokin, Здраствуйте, есть такой вопрос, есть ли у Вас документ в котором написаны команды для передачи прав пользователю или админу и как примерно это реализуется. Мне нужно сделать просто форму в которой я буду выбирать пользователя и давать ему права.
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
30.09.2021, 19:21 28
Цитата Сообщение от goodrogrammer Посмотреть сообщение
как примерно это реализуется
SQL
1
2
3
4
/* Добавляем пользователя с ролью с нуля */
INSERT INTO Users (Login, Password, RoleId) VALUES ('username', 'pwd12345', 1)
/* Обновляем существующему пользователю роль, по Id пользователя */
UPDATE Users SET RoleId=1 WHERE Id=2897
0
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
30.09.2021, 19:30  [ТС] 29
ipsorokin, Расскажите как это работает?
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
30.09.2021, 19:35 30
goodrogrammer конечно, вот читайте:
INSERT
UPDATE
WHERE
Суть такая же как и в MySql, а картинки лучше.
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
30.09.2021, 23:57 31
goodrogrammer, Похоже, Вы не совсем понимаете роль ролей
Роли предназначены для разграничения прав одних пользователей (групп пользователей) от других.
Например, в БД фирмы есть три роли: "гость", "сотрудник" и "администратор".
Для "Г" предусмотрен только режим просмотра состава сотрудников без личных данных и окладов: только ФИО, отдел и должность.
Для "С" можно дополнительно увидеть адреса и телефоны. Также разрешена правка (изменение, добавление, удаление)
Для "А" видно все и править можно также все. Дополнительно админ может менять роли у всех пользователей приложения.

Все пользователи могут менять собственные данные, например, ФИО, пароль.

Как роли реализуются.
Есть два основных способа: серверный и прикладной.

Серверный.

Когда пользователи и роли регистрируются в БД на самом SQL-сервере (user, role). При этом каждому пользователю или группе пользователей назначается одна или более ролей. Роли указывают серверу, какие данные и из каких таблиц можно извлекать или менять.
Чаще всего ролям "отдают" представления (Views), заранее настроенные нужным способом (например, для роли "Г" вьюшка не предоставляет личных данных (адрес, телефон, оклад и т.д.)
Само ведение такой базы осуществляется обыкновенно сисадмином или админом БД через специальные приложения либо (чаще всего) средствами SQL. При этом никакой специальной таблицы пользователей непосредственно в БД не требуется.

При открытии БД с клиентского ПК в строке подключения указывается логин и пароль пользователя. Откуда они берутся ? Либо само приложение предусматривает их указание при запуске программы, либо они считываются их файла установок приложения. При соединении выполняется проверка введенных (либо "поднятых" из ini-файла) логина и пароля (идентификация) самим SQL-сервером и соединение либо открывается либо выдается ошибка (sql-exception), на которое программа реагирует соответствующим месседжем.

В случае успешного открытия соединения приложение вызывает те вьюхи или хранимки, которые доступны роли (ролям), назначенным этому пользователю сисадмином.

Добавлено через 12 минут
Серверный подход имеет ряд весьма серьезных преимуществ.
1. Освобождает разработчика клиентского ПО от каких-либо процедур определения прав на БД. Он просто пишет концептуальное приложение, например, для бухгалтера. Что показывать ему и какие давать возможности для внесения изменений - это определяет сам SQL-сервер, точнее, его бизнес-логика.
2. Централизует и унифицирует распределение функционала для всего клиентского ПО, работающего с этой БД. Даже если в системе крутится 100 разных клиентских программ, все изменения в правах делаются один раз и действую на все 100 приложений.

Этот метод широко применяется в больших системах типа ERP/MRP крупных организаций, где разделение прав пользователей ПК имеет особое значение.

Добавлено через 25 минут
Клиентский.

SQL-сервер ничего не знает ни о каких пользователях и ролях. Для него любое соединение - это возможность делать с содержимым БД (в том числе с метаданными) все, что угодно. Лишь бы не нарушало целостности самой БД.

В базе должна быть одна (чаще всего) либо несколько таблиц, содержащих сведения о пользователях, из которых только три являются обязательными: id, login и password (имена полей в таблице могут быть другими, но суть - неизменной). Для распознавания разных типов пользователей (ролей, если хотите) добавляется еще одно или более полей, назовем их "ролевые параметры" (РП).
"Раздача слонов" обычно также выполняется на "чистом" SQL админом либо специальной программой, с помощью которой тот же админ "вешает" РП каждому пользователю, разрешая либо запрещая ему определенные действия с БД.
При разработке клиентского ПО программист пишет некий функционал, зависимый от того, кто именно работает с программой. Этот функционал напрямую зависит от алгоритмики авторизации и может быть доступным либо недоступным.
Для приведенного выше примера с "Г", "С" и "А" он (функционал) должен быть в строгом соответствии. Т.е. если вошел "Г" то грид с сотрудниками будет иметь 3 колонки (ФИО, отдел, должность) и при этом никакой правки - только сортировка, поиск, фильтрация. Для "С" в гриде появятся дополнительные колонки: адрес, телефон, оклад. А также в меню появятся пункты "Добавить", "Изменить", "Удалить".
Для "А" кроме "большого" грида появится дополнительная кнопка "Пользователи", нажав которую, он откроет окошко с таблицей пользователей (не путать с сотрудниками !), которую может править в полном объеме (кроме пароля, который он не имеет права даже знать, не то, что изменять).
Вся эта логика должна быть реализована в приложении. Если через время возникнет необходимость написание другого приложения для этой базы, то всю эту "карусель" с "фичами" придется повторить.

В этом состоит недостаток метода.

Но есть и еще один, куда более серьезный недостаток - это "независимость" клиентской авторизации от серверной. Что это значит ? Менеджеру Пупкину захотелось поправить себе оклад. Из приложения он этого сделать не сможет, но у Васи есть друг-студент Ваня, который знаком с SQL. Ваня за "пирожок" от друга заходит на SQL-сервер конторы из какого-нибудь пыхадмина (MySQL), "жабки" (Oracle) или SSMS (MS SQL) и спокойно пишет update, дописывающий нолик к Васиному
окладу

В "серверном" варианте такое просто сделать нельзя
1
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
01.10.2021, 17:42  [ТС] 32
MsGuns, Спасибо за столько написанной Вами информации, я всё это знаю, как что и где, но написать то что мне нужно я не могу, то есть не умею, знаний не хватает, да и у меня только сейчас началось изучение C#, и в чем интерес дают задания, и говорят делай сам, а намекают на то что списывал с интернета или проси помощи, вот я и прошу у Вас помощи, да возможно я не могу правильно выразить свои мысли на форуме, поэтому меня и не понимаю многие взрослые люди. У меня только БД есть с пользователями и БД admin( создал её для того чтобы там хранились имена пользователя и роли), мне нужно сделать роли, допустим кому-то я даю роль админа, кому-то разработчики, пользователя или админа сети. Мне нужна помощь с кодом, я могу дать код программы и кто-нибудь может мне поможет решить данную проблему.

Эта проблема заключается в том что, у меня есть регистрация и смена старого пароля на новый, после этого эти все данные хранятся и изменяются в БД, и есть кнопка вход, работает она после того как я введу логин:пароль и переду на пустую форму, но мне ещё нужна кнопка "для администрации" в которой я выбираю пользователя по surname(фамилии) и выдаю ему роли как я писал выше, НО кнопка "для администрации" должна работать всем кроме user.
И после того как я выдам роль, в БД в таблице admin, должно показать что у такой то фамилии такая то роль, и главное что ещё это то что при вводе логина:пароля в программе и нажатия кнопки Вход, я перехожу на другую форму в которой есть просто кнопка добавить, но она должна быть доступна всем кроме user. Вот с этим я и прошу у Вас помощи, я говорю уже второй раз я не умею нечего делать, только кроме того как найти в YouTube видео-курс где человек показывает и пишет код программы с формами (допустим вход и регистрация с помощью БД).
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
01.10.2021, 17:51 33
Тут в какой-то теме предлагали обращаться в министерство образования, если Вам задают то, что Вы даже не изучали)))
0
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
01.10.2021, 19:48  [ТС] 34
ipsorokin, Я просто рассказал что и как. Я всего лишь прошу помочь с программой.
0
1496 / 1238 / 244
Регистрация: 04.04.2011
Сообщений: 4,362
01.10.2021, 23:11 35
goodrogrammer, Работа Вашей программы начинается с авторизации, так ? Если пользователь авторизирован успешно (введенные логин и пароль найдены в БД), то Вы имеете его данные, вычитанные в запросе авторизации.
Эти данные лучше всего поместить в Модель, экземпляр класса из папки Models проекта. Она будет доступна всем формам приложения, сколь много их ни будет.
В числе прочих атрибутов - полей модели, есть и "роль". Ее-то Вы и анализируете, настраивая интерфейс. В частности для админа показываете кнопку "для администрации", для остальных кнопка невидима.
Точно так же строите логику построения всего интерфейса приложения. По принципу, что можно Юпитеру, то нельзя быку
0
295 / 119 / 33
Регистрация: 06.03.2016
Сообщений: 453
01.10.2021, 23:21 36
MsGuns его не интересуют пояснения нисколько. Это уже, наверное, третья тема про роли его. За это время сам уже мог бы сделать, т.к. всё ищется с первой/второй ссылки максимум. В черный список таких)))

goodrogrammer, развлекайтесь дальше сами. Как хотите. За год на форуме можно было в элементарном разобраться уже. Понятия не имею, работает код ниже или нет. Не могу и не хочу проверять.
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE DATABASE IF NOT EXISTS `dbIdentity`;
CREATE TABLE `dbIdentity`.`Roles`
(
    `Id` INT PRIMARY KEY AUTO_INCREMENT, 
    `Name` VARCHAR(50) NOT NULL
);
CREATE TABLE `dbIdentity`.`Users`
(
    `Id` INT PRIMARY KEY AUTO_INCREMENT, 
    `Name` VARCHAR(50) NOT NULL, 
    `Login` VARCHAR(50) NOT NULL UNIQUE, 
    `Password` VARCHAR(200) NOT NULL, 
    `RoleId` INT NULL,
     FOREIGN KEY (`RoleId`) REFERENCES `dbIdentity`.`Roles` (`Id`) ON DELETE SET NULL
);
INSERT INTO `dbIdentity`.`roles` (`Name`) VALUES ('Admin'), ('SysAdmin'), ('User');
INSERT INTO `dbIdentity`.`users` (`Name`, `Login`, `Password`, `RoleId`) VALUES ('Adam', 'userAdam', 'pass1', 1), ('Rolan', 'userRolan', 'pass2', 2), ('Eva', 'userEva', 'pass3', 3);
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
    public class UserManager
    {
        private MySqlConnection connection;
        private MySqlDataAdapter adapter;
        private string connectionString;
 
        public List<Role> Roles { get; set; }
        public DataSet Users { get; private set; }
 
        public UserManager(string dbName) => OnConnectionBuilder(dbName);
 
        private void OnConnectionBuilder(string dbName)
        {
            connectionString = new MySqlConnectionStringBuilder()
            {
                Database = dbName,
                UserID = "root",
                Password = "password",
                Server = "localhost",
                Port = 3306
            }.ToString();
            FillRoles();
            FillUsers();
        }
 
        /// <summary>
        /// Создает пользователя
        /// </summary>
        /// <param name="user"></param>
        /// <param name="password"></param>
        public void Create(User user, string password)
        {
            using (connection = new MySqlConnection(connectionString))
            {
                MySqlCommand command = new("INSERT INTO `Users` (`Name`, `Login`, `Password`, `RoleId`) VALUES (@name, @lgn, @pwd, @role)", connection);
                command.Parameters.AddWithValue("@name", user.Name);
                command.Parameters.AddWithValue("@lgn", user.Login);
                command.Parameters.AddWithValue("@pwd", password);
                command.Parameters.AddWithValue("@role", user.RoleId);
                execute(command);
            }
            FillUsers();
        }
        /// <summary>
        /// Изменяет пароль
        /// </summary>
        /// <param name="user"></param>
        /// <param name="oldPassword"></param>
        /// <param name="newPassword"></param>
        public void ChangePassword(User user, string oldPassword, string newPassword)
        {
            using (connection = new MySqlConnection(connectionString))
            {
                MySqlCommand command = new("UPDATE `Users` SET `Password`=@npwd WHERE `Id`=@id AND `Password`=@opwd", connection);
                command.Parameters.AddWithValue("@npwd", newPassword);
                command.Parameters.AddWithValue("@id", user.Id);
                command.Parameters.AddWithValue("@opwd", oldPassword);
                execute(command);
            }
        }
 
        /// <summary>
        /// Ищет пользователя по Id
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public User Find(int id)
        {
            using (connection = new MySqlConnection(connectionString))
            {
                MySqlCommand command = new("SELECT u.`Id`, u.`Name`, `Login`, r.`Name` as `RoleName` FROM `Users` u LEFT JOIN `Roles` r ON r.`Id`=u.`RoleId` WHERE `Id`=@id", connection);
                command.Parameters.AddWithValue("@id", id);
                return getUser(command);
            }
        }
        /// <summary>
        /// Ищет пользователя по логину
        /// </summary>
        /// <param name="login"></param>
        /// <returns></returns>
        public User FindByLogin(string login)
        {
            using (connection = new MySqlConnection(connectionString))
            {
                MySqlCommand command = new("SELECT u.`Id`, u.`Name`, `Login`, r.`Name` as `RoleName` FROM `Users` u LEFT JOIN `Roles` r ON r.`Id`=u.`RoleId` WHERE `Login`=@lgn", connection);
                command.Parameters.AddWithValue("@lgn", login);
                return getUser(command);
            }
        }
        /// <summary>
        /// Удаляет пользователя
        /// </summary>
        /// <param name="user"></param>
        public void Remove(User user)
        {
            using (connection = new MySqlConnection(connectionString))
            {
                MySqlCommand command = new("DELETE `Users` WHERE `Id`=@id", connection);
                command.Parameters.AddWithValue("@id", user.Id);
                execute(command);
            }
            FillUsers();
        }
        /// <summary>
        /// Авторизация
        /// </summary>
        /// <param name="login"></param>
        /// <param name="password"></param>
        /// <returns></returns>
        public User SignIn(string login, string password)
        {
            using (connection = new MySqlConnection(connectionString))
            {
                MySqlCommand command = new("SELECT u.`Id`, u.`Name`, `Login`, r.`Name` as `RoleName` FROM `Users` u LEFT JOIN `Roles` r ON r.`Id`=u.`RoleId` WHERE `Login`=@lgn AND `Password`=@pwd", connection);
                command.Parameters.AddWithValue("@lgn", login);
                command.Parameters.AddWithValue("@pwd", password);
                return getUser(command);
            }
        }
        /// <summary>
        /// Обновляет пользователя
        /// </summary>
        /// <param name="user"></param>
        public void Update(User user)
        {
            using (connection = new MySqlConnection(connectionString))
            {
                MySqlCommand command = new("UPDATE `Users` SET `Login`=@lgn, `Name`=@name, `RoleId`=@role WHERE `Id`=@id", connection);
                command.Parameters.AddWithValue("@lgn", user.Login);
                command.Parameters.AddWithValue("@name", user.Name);
                command.Parameters.AddWithValue("@role", user.RoleId);
                command.Parameters.AddWithValue("@id", user.Id);
                execute(command);
            }
            FillUsers();
        }
 
        private User getUser(MySqlCommand command)
        {
            User user = null;
            connection.Open();
            var reader = command.ExecuteReader();
            if (reader.HasRows)
            {
                while (reader.Read())
                    user = new User()
                    {
                        Id = Convert.ToInt32(reader["Id"]),
                        Name = Convert.ToString(reader["Name"]),
                        Login = Convert.ToString(reader["Login"]),
                        Role = new Role() { Name = Convert.ToString(reader["RoleName"]) }
                    };
            }
            connection.Close();
            return user;
        }
 
        private void execute(MySqlCommand command)
        {
            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
        }
 
        private void FillRoles()
        {
            using (connection = new MySqlConnection(connectionString))
            {
                Roles = new List<Role>();
                MySqlCommand command = new("SELECT `Id`, `Name` FROM `Roles`", connection);
                connection.Open();
                var reader = command.ExecuteReader();
                if (reader.HasRows)
                    while (reader.Read())
                        Roles.Add(new Role()
                        {
                            Id = Convert.ToInt32(reader["Id"]),
                            Name = Convert.ToString(reader["Name"])
                        });
                connection.Close();
            }
        }
 
        private void FillUsers()
        {
            Users = new DataSet();
            adapter = new MySqlDataAdapter
            {
                SelectCommand = new MySqlCommand("SELECT u.`Id`, u.`Name`, `Login`, r.`Name` as `RoleName` FROM `Users` u LEFT JOIN `Roles` r ON r.`Id`=u.`RoleId`", connection)
            };
            adapter.Fill(Users, "Users");
        }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    public class Role
    {
        public int Id { get; set; }
        public string Name { get; set; }
 
        public override string ToString() => Name;
    }
    public class User
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
        public int? RoleId { get; set; }
 
        public Role Role { get; set; }
    }
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
    public partial class Form1 : Form
    {
        private UserManager userManager;
 
        public Form1()
        {
            InitializeComponent();
            this.Load += Form1_Load;            
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            userManager = new UserManager("dbIdentity");
        }
 
        private void SignIn(object sender, EventArgs e)
        {
            try
            {
                var user = userManager.SignIn(login.Text, password.Text);
                if (user == null)
                {
                    MessageBox.Show("Неверный логин и/или пароль.");
                    return;
                }
 
                MessageBox.Show($"Welcome, {user.Name}!");
                Form2 next = new(userManager, user);
                next.Show();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
    }
    public partial class Form2 : Form
    {
        private UserManager userManager;
        private User selectedUser;
 
        private readonly string[] roleIsAdmin = new string[] { "Admin", "SysAdmin" };
 
        public Form2(UserManager userManager, User user)
        {
            this.userManager = userManager;
            InitializeComponent();
            if (!roleIsAdmin.Contains(user.Role?.Name))
            {
                update.Enabled = false;
                pwdChange.Enabled = false;
            }
        }
 
        private void Form2_Load(object sender, EventArgs e)
        {
            roles.DataSource = userManager.Roles;
            dgvUsers.DataSource = userManager.Users.Tables["Users"];
        }
 
        private void dgv_Click(object sender, EventArgs e)
        {
            selectedUser = new User()
            {
                Id = (int)dgvUsers.CurrentRow.Cells["Id"].Value,
                Name = (string)dgvUsers.CurrentRow.Cells["Name"].Value,
                Login = (string)dgvUsers.CurrentRow.Cells["Login"].Value,
                Role = userManager.Roles.FirstOrDefault(p => p.Name == (string)dgvUsers.CurrentRow.Cells["RoleName"].Value),
            };
            selectedUser.RoleId = selectedUser.Role?.Id;
 
            login.Text = selectedUser.Login;
            name.Text = selectedUser.Name;
            roles.SelectedItem = selectedUser.Role;
        }
 
        private void update_Click(object sender, EventArgs e)
        {
            selectedUser.Login = login.Text;
            selectedUser.Name = name.Text;
            userManager.Update(selectedUser);
            dgvUsers.DataSource = userManager.Users.Tables["Users"];
        }
 
        private void pwdChange_Click(object sender, EventArgs e)
        {
            userManager.ChangePassword(selectedUser, oldPassword.Text, newPassword.Text);
        }
    }
Вложения
Тип файла: zip WinFormsApp1.zip (100.7 Кб, 4 просмотров)
0
40 / 44 / 1
Регистрация: 19.01.2021
Сообщений: 534
02.10.2021, 00:33  [ТС] 37
ipsorokin, Сами сделали?

Добавлено через 1 минуту
ipsorokin, Что Вы имели ввиду написав это - "За год на форуме можно было в элементарном разобраться уже" ?

Добавлено через 56 секунд
ipsorokin, До этого я занимался С+.

Добавлено через 37 минут
ipsorokin, Спасибо за помощь, пойду разбираться.
0
02.10.2021, 00:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.10.2021, 00:33
Помогаю со студенческими работами здесь

Какова роль new int в приведенном коде
Делаю лабораторную. Вот хочу разобраться. Это часть кода, где мы вводим двумерный массив. а что...

Какую роль в коде выполняет амперсанд
Выделенное жирным, обьясните плз как это называется, что это такое. А то препод просек что работу...

Какую роль выполняют идентификаторы в приведенном коде?
Подскажите пожалуйста,какие в данной задаче идентификаторы и их назначение в ней. #include...

Объясните фрагмент в коде: какую роль играет split()
есть функция, которая выводит введенные числа в обратном порядке &lt;script&gt; function sort() ...

Java надо сделать пожалуйста две программы на Java ! Опишу их ниже в коде
Первая: может читать информацию из клавиатуры и писать эту информацию в внешний файл... Вторая: З...

Как исправить ошибку в коде программы?
Цель такая - выбраны строки 1 (тонна) в CоmboBox4 и строка 2 (центнер) в ComboBox5. В TextBox3...

Как включить подчеркивание в коде программы?
Как включить подчеркивание в коде программы ? Чтобы менялось значение ТОЛЬКО подчеркивания,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru