Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/120: Рейтинг темы: голосов - 120, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 5
1

Авторизация с разными ролями

12.06.2019, 15:45. Показов 23931. Ответов 11

Author24 — интернет-сервис помощи студентам
Добрый день всем, столкнулась с проблемой, гугл ничего нормального не дал (либо я тупенькая, что не могу додуматься), тем не менее уже неделю ломаю голову над этим.
Есть бд MySql - удаленная.
Есть формы для админа и для юзера.
Проблема с авторизацией.
В таблице юзеров есть поля: фамилия, имя, отчество, мыло, логин, пароль, роль (Администратор или Пользователь)
В чем суть проблемы:
Человек вводит свои данные, которые есть в таблице: логин и пароль
Нужно написать код, который по введенным данным определит какая роль у этого человека и открыть соответствующую для этого человека форму.
На данный момент имеется проверка логина/пароля, но как туда воткнуть роль, чтобы открывались разные формы - не знаю.
Помогите! Заранее спасибо за помощь♥
Код:
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
 private bool Check_boxes_filed()
        {
            if (log.Text.Length == 0)
            {
                MessageBox.Show("Введите логин");
                log.Focus();
                return false;
            }
            if (pass.Text.Length == 0)
            {
                MessageBox.Show("Введите пароль");
                pass.Focus();
                return false;
            }
            return true;
        }
        private bool Validate_password()
        {
            conn = new MySqlConnection(webAppConnection_string);
            conn.Open();
 
            string query_str = "SELECT COUNT( * )" +
                   "FROM userregistration " +
                   "WHERE username='" + MySql.Data.MySqlClient.MySqlHelper.EscapeString(log.Text) +
                   "' AND password='" + MySql.Data.MySqlClient.MySqlHelper.EscapeString(pass.Text) + "'";
 
            cmd = new MySqlCommand(query_str, conn);
 
            MySqlConnection myConnection = new MySqlConnection(webAppConnection_string);
            MySqlCommand myCommand = new MySqlCommand(query_str, myConnection);
 
            myConnection.Open(); //Устанавливаем соединение с базой данных.
            long loginPasswordExists = (long)myCommand.ExecuteScalar();                    
            myConnection.Close(); //Обязательно закрываем соединение!            
            if (loginPasswordExists == 1)
            {
                return true;
            }
            MessageBox.Show("Пользователь не найден");
            return false;
        } 
private void Login_Click(object sender, EventArgs e)
        {
            if (!this.Check_boxes_filed())
            {
                return;
            }
            if (!this.Validate_password())
            {
                return;
            }
         }
На скринах - авторизация, форма админа, форма юзера
Миниатюры
Авторизация с разными ролями   Авторизация с разными ролями   Авторизация с разными ролями  

0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.06.2019, 15:45
Ответы с готовыми решениями:

Вход в базу под разными ролями
Помогите пожалуйста. весь мозг сломала. имеется база данных. в ней таблица сотрудники (логин,...

Авторизация ролями
Люди помогите!Вообще не могу разобраться с принципом работы!Как реализовать Роли? Аутентификация...

Работа с ролями
Не понимаю почему вылезает ошибка Ошибка в ограничении доступа к данным. объект:...

Проблема с ролями
Здравствуйте, проблема вот чем, создавал роли и пользователей, добавил роль администратор которой...

11
1471 / 928 / 452
Регистрация: 06.02.2012
Сообщений: 2,846
12.06.2019, 19:11 2
Лучший ответ Сообщение было отмечено nooccar как решение

Решение

nooccar, Вот вам класс. Для работы с MySql.
Кликните здесь для просмотра всего текста

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
using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Windows.Forms;
class MySqlHelper
    {
        private static string stringConnection;
        private static MySqlDataAdapter MySql_dataAdapter;
        private static MySqlConnection MySql_connect;
        private static MySqlCommand MySql_command;
 
        /// <summary>
        /// Возвращает текущую виртуальную таблицу.
        /// </summary>
        public static DataTable Table { get; private set; }
 
        /// <summary>
        /// Строка подключения к базе данных
        /// </summary>
        public static string DataBaseConnection
        {
            set
            {
                stringConnection = value;
 
                //Строка для подключение к базе данных.
                MySql_connect = new MySqlConnection(stringConnection);
 
                //Открываем соединение с базой данных.
                MySql_connect.Open();
            }
        }
 
        /// <summary>
        /// Выполняет запрос к базе данных
        /// </summary>
        /// <param name="script">Скрипт запроса(INSERT, UPDATE, DELETE)</param>
        public static void Execut(string script)
        {
            try
            {
                //Открываем соединение с базой данных.
                MySql_connect.Open();
                MySql_command = MySql_connect.CreateCommand();
                MySql_command.CommandText = script;
                MySql_command.ExecuteNonQuery();
                CloseDB();
            }
            catch (Exception ex) { CloseDB(); MessageBox.Show(ex.Message); }
        }
 
        /// <summary>
        /// Выполняет запрос к базе данных и возвращает DataTable
        /// </summary>
        /// <param name="script">Скрипт запроса(INSERT, UPDATE, DELETE)</param>
        /// <param name="SelectScript">Скрипт запроса(SELECT)</param>
        /// <returns></returns>
        public static DataTable Execut(string script, string SelectScript)
        {
            try
            {
                MySql_connect.Open();
                MySql_command = MySql_connect.CreateCommand();
                MySql_command.CommandText = script;
                MySql_command.ExecuteNonQuery();
                return RunQuery(SelectScript);
            }
            catch (Exception ex) { CloseDB(); MessageBox.Show(ex.Message); return Table; }
        }
 
        /// <summary>
        /// Выполняет запрос к базе данных и возвращает DataTable
        /// </summary>
        /// <param name="script">Скрипт запроса(SELECT)</param>
        public static DataTable RunQuery(string script)
        {
            try
            {
                MySql_dataAdapter = new MySqlDataAdapter(script, MySql_connect);
                Table = new DataTable();
                MySql_dataAdapter.Fill(Table);
                CloseDB();
            }
            catch (Exception ex) { CloseDB(); MessageBox.Show(ex.Message); }
 
            return Table;
 
        }
 
        /// <summary>
        /// Возвращает значение ячейки.
        /// </summary>
        /// <param name="col">Индекс столбца</param>
        /// <param name="row">Индекс строки</param>
        /// <returns></returns>
        public static object GetCellValue(int col, int row)
        {
           return Table.Rows.Count != 0 ? Table.Rows[row].ItemArray[col] : 0;
        }
 
        /// <summary>Закрывает соединение с базой данных
        /// 
        /// </summary>
        public static void CloseDB()
        {
            //Закрываем соединение с бд
            if (MySql_connect != null)
                MySql_connect.Close();
        }
    }

Как пользоваться.
Кликните здесь для просмотра всего текста

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
          //Создаем событие при первом старте программы
          private void Form1_Load(object sender, EventArgs e)
          {
               MySqlHelper.DataBaseConnection = "Строка подключения";
          }
 
        //Событие происходит всякий раз, при нажатие на кнопку "Авторизация"
        private void BtnAuthorization_Click(object sender, EventArgs e)
        {
            Authorization(log.Text, pass.Text, out object role);
            if (role.ToString() != "0")
            {
                if (role.ToString() == "Пользователь")
                {
                    //Если (Пользователь)
                }
                else
                {
                    //Если (Администратор)
                }
            }
            else
                MessageBox.Show("Пользователь не найден");
 
        }
 
 
        /// <summary>
        /// Метод выполняет авторизацию.
        /// </summary>
        /// <param name="login">Логин</param>
        /// <param name="password">Пароль</param>
        /// <param name="role">Возвращает роль юзера</param>
        private void Authorization(string login, string password, out object role)
        {
            // В вашей бд должна быть колонка с любым названием. Я назвал (role), тип ее на ваше усмотрение. int, string, nvarchar и.т.п
            MySqlHelper.RunQuery($@"SELECT role
                                           FROM userregistration
                                     WHERE username='{login}' AND password='{password}'");
            //Получаем значение ячейки, Где 1 - это колонка, где - 0 это строка
            role = MySqlHelper.GetCellValue(1, 0);
        }


Если после запроса нужно вывести в таблицу, то так.
C#
1
2
MySqlHelper.RunQuery("SELECT * FROM userregistration");
dgv.DataSource = MySqlHelper.Table;
//Или так
Если после запроса нужно вывести в таблицу, то так.
C#
1
dgv.DataSource = MySqlHelper.RunQuery("SELECT * FROM userregistration");
1
0 / 0 / 0
Регистрация: 03.12.2016
Сообщений: 5
12.06.2019, 19:37  [ТС] 3
Цитата Сообщение от Kazbek17 Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
private void BtnAuthorization_Click(object sender, EventArgs e)
{
Authorization(log.Text, pass.Text, out object role);
 if (role.ToString() != "0")
 {
if (role.ToString() == "Пользователь")
{
//Если (Пользователь)
 }
. . .
- Недопустимый термин "object" в выражении
- Ну и далее имя (у меня charact, у вас role) не существует в текущем контексте
0
3560 / 2501 / 1174
Регистрация: 14.08.2016
Сообщений: 8,206
12.06.2019, 21:49 4
nooccar, либо выбери версию фреймворка 4.5+, либо перепиши вот так
C#
1
2
3
4
5
6
7
8
9
10
11
private void BtnAuthorization_Click(object sender, EventArgs e)
{
object role;
Authorization(log.Text, pass.Text, out role);
 if (role.ToString() != "0")
 {
if (role.ToString() == "Пользователь")
{
//Если (Пользователь)
 }
. . .
0
0 / 0 / 0
Регистрация: 08.11.2019
Сообщений: 36
04.11.2021, 13:20 5
А можешь пожалуйста для примера скинуть свою работу?
Хочется посмотреть пару моментов?
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 4
26.07.2022, 08:47 6
Бодрый день, выдает ошибку на это строке, после удачного ввода логина и пароля.

return Table.Rows.Count != 0 ? Table.Rows[row].ItemArray[col] : 0;


System.IndexOutOfRangeException
HResult=0x80131508
Сообщение = Index was outside the bounds of the array.
Источник = baza
Трассировка стека:
в MySqlHelper.GetCellValue(Int32 col, Int32 row) в D:\проект\baza\baza\baza\DB.cs:строка 76
в baza.Form1.Authorization(String login, String pass, Object& role) в D:\проект\baza\baza\baza\Form1.cs:строка 65
в baza.Form1.button1_Click(Object sender, EventArgs e) в D:\проект\baza\baza\baza\Form1.cs:строка 31
в System.Windows.Forms.Control.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnClick(EventArgs e)
в System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
в System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
в System.Windows.Forms.Control.WndProc(Message& m)
в System.Windows.Forms.ButtonBase.WndProc(Message& m)
в System.Windows.Forms.Button.WndProc(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
в System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
в System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, WM msg, IntPtr wparam, IntPtr lparam)
0
2806 / 1676 / 884
Регистрация: 14.04.2015
Сообщений: 5,717
26.07.2022, 12:38 7
notepc, в методе Authorization в форме измените строку
C#
1
role = MySqlHelper.GetCellValue(1, 0);
на
C#
1
role = MySqlHelper.GetCellValue(0, 0);
1
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 4
27.07.2022, 00:00 8
Спасибо помогло, но теперь Админ с ролью 1 заходит, а Пользователь с ролью 0 нет, Пользователь не найден.
0
2806 / 1676 / 884
Регистрация: 14.04.2015
Сообщений: 5,717
27.07.2022, 08:44 9
notepc, так покажите, как Вы реализовали у себя. Какой код брали, куда его копировали?
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 4
28.07.2022, 00:29 10
Это код события кнопки

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
using Microsoft.SqlServer.Management.Smo;
using MySql.Data.MySqlClient;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
 
namespace baza
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        //Создаем событие при первом старте программы
        private void Form1_Load(object sender, EventArgs e)
        {
            MySqlHelper.DataBaseConnection = "server=localhost;port=3306;username=root;password=root;database=baza";
        }
 
        //Событие происходит всякий раз, при нажатие на кнопку "Авторизация"
        private void button1_Click(object sender, EventArgs e)
        {
            Authorization(BoxLogin.Text, BoxPass.Text, out object role);
            if (role.ToString() != "0")
            {
                if (role.ToString() == "Пользователь")
                {
                    this.Hide();
                    MainUser mainuser = new MainUser();
                    mainuser.Show();
                }
                else
                {
                    this.Hide();
                    MainForm mainform = new MainForm();
                    mainform.Show();
                }
            }
            else
                MessageBox.Show("Пользователь не найден");
 
 
        }
 
 
        /// <summary>
        /// Метод выполняет авторизацию.
        /// </summary>
        /// <param name="login">Логин</param>
        /// <param name="pass">Пароль</param>
        /// <param name="role">Возвращает роль юзера</param>
        private void Authorization(string login, string pass, out object role)
        {
            // В вашей бд должна быть колонка с любым названием. Я назвал (role), тип ее на ваше усмотрение. int, string, nvarchar и.т.п
            MySqlHelper.RunQuery($@"SELECT role
                                           FROM users
                                     WHERE login='{login}' AND pass='{pass}'");
            //Получаем значение ячейки, Где 1 - это колонка, где - 0 это строка
            role = MySqlHelper.GetCellValue(0, 0);
        }
 
        
       
    }
}
Подключение к базе

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
using MySql.Data.MySqlClient;
using System;
using System.Data;
using System.Windows.Forms;
class MySqlHelper
{
    private static string stringConnection;
    private static MySqlDataAdapter MySql_dataAdapter;
    private static MySqlConnection MySql_connect;
    private static MySqlCommand MySql_command;
 
    
    public static DataTable Table { get; private set; }
 
    
    public static string DataBaseConnection
    {
        set
        {
            stringConnection = value;
 
            MySql_connect = new MySqlConnection(stringConnection);
 
            MySql_connect.Open();
        }
    }
 
    
    public static void Execut(string script)
    {
        try
        {
            MySql_connect.Open();
            MySql_command = MySql_connect.CreateCommand();
            MySql_command.CommandText = script;
            MySql_command.ExecuteNonQuery();
            CloseDB();
        }
        catch (Exception ex) { CloseDB(); MessageBox.Show(ex.Message); }
    }
 
    
    public static DataTable Execut(string script, string SelectScript)
    {
        try
        {
            MySql_connect.Open();
            MySql_command = MySql_connect.CreateCommand();
            MySql_command.CommandText = script;
            MySql_command.ExecuteNonQuery();
            return RunQuery(SelectScript);
        }
        catch (Exception ex) { CloseDB(); MessageBox.Show(ex.Message); return Table; }
    }
 
    
    public static DataTable RunQuery(string script)
    {
        try
        {
            MySql_dataAdapter = new MySqlDataAdapter(script, MySql_connect);
            Table = new DataTable();
            MySql_dataAdapter.Fill(Table);
            CloseDB();
        }
        catch (Exception ex) { CloseDB(); MessageBox.Show(ex.Message); }
 
        return Table;
 
    }
 
   
    public static object? GetCellValue(int col, int row)
    {
        return Table.Rows.Count != 0 ? Table.Rows[row].ItemArray[col] : 0;
    }
 
    
    public static void CloseDB()
    {
       if (MySql_connect != null)
            MySql_connect.Close();
    }
}
0
1471 / 928 / 452
Регистрация: 06.02.2012
Сообщений: 2,846
28.07.2022, 06:11 11
notepc, значение в таблице должны быть не числовые. Или Пользователь или Администратор. Если вы хотите проверку по числовому значению, то измените условие проверки.
0
0 / 0 / 0
Регистрация: 24.06.2022
Сообщений: 4
28.07.2022, 07:18 12
Большое спасибо!
0
28.07.2022, 07:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.07.2022, 07:18
Помогаю со студенческими работами здесь

Управление ролями пользователей
Добрый день! В веб-приложении есть страница, на которой администратор может просмотреть все...

Что не так с ролями?
Добрый день. надо дать доступ человеку к отчёту. иду в роль, которая (в том числе) есть у этого...

Проблема с ролями в Asp net Identity
Здравствуйте. Начал изучать Asp Net Identity. И решил сделать следующее. У меня есть список ролей,...

Два сервера с ролями контроллера доменов
Доброго времени суток, товарищи. У меня вопрос. У нас не такой большой отдел, 35 машин и все...


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

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