Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 17.10.2018
Сообщений: 51
1

Форма авторизации - вне зависимости от выбранного пользака, открывается одна и та же форма

15.10.2019, 13:44. Показов 1643. Ответов 6
Метки нет (Все метки)

Форма авторизации - вне зависимости от выбранного пользака, открывается одна и та же форма
Есть два пользака - главбух и ведущий бух
В комбобоксе выбирается один или второй, вводится соответствующий код, данные сравниваются с содержимым таблицы в БД
затем должна открываться соответствующая форма.
НО! Открывается одна и та же форма. Форма главбуха.
Да, формы разные и подписаны по-разному.

Код
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
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;
using System.Data.SqlClient;
 
namespace Kurs
{
    public partial class FormLogin : Form
    {
        public FormLogin()
        {
            InitializeComponent();
        }
 
        public bool GbuhAuth { get; private set; }
        public bool VbuhAuth { get; private set; }
        public static string login;
 
        private void FormLogin_Load(object sender, EventArgs e)
        {
            cbUser.Text = Properties.Settings.Default.loginValue;
            this.ActiveControl = tbPassword;
        }
 
        private void BtnLogin_Click(object sender, EventArgs e)
        {     
            using (SqlConnection sqlCon = new SqlConnection(CommonData.connString))
            {
                SqlDataAdapter sda = new SqlDataAdapter("Select FIO_user From Users where Name_user='" + cbUser.Text + "' and Pass_user = '" + tbPassword.Text + "' and Access_user = 1", CommonData.connString);
                SqlDataAdapter sda1 = new SqlDataAdapter("Select FIO_user From Users where Name_user='" + cbUser.Text + "' and Pass_user = '" + tbPassword.Text + "' and Access_user = 2", CommonData.connString);
                DataTable dt = new DataTable();
                DataTable dt2 = new DataTable();
                sda.Fill(dt);
                sda1.Fill(dt2);
                if (dt.Rows.Count > 0)
                {
                    login = dt.Rows[0][0].ToString();
                    this.GbuhAuth = true;
                    MessageBox.Show("Авторизация пройдена.");
                    this.Close();
                }
                else if (dt2.Rows.Count > 0)
                {
                    login = dt2.Rows[0][0].ToString();
                    this.VbuhAuth = true;
                    MessageBox.Show("Авторизация пройдена.");
                    this.Close();
                }
                else
                {
                    MessageBox.Show("Неправильный логин/пароль.",
                                "Авторизация",
                                MessageBoxButtons.OK,
                                MessageBoxIcon.Error,
                                MessageBoxDefaultButton.Button1,
                                MessageBoxOptions.DefaultDesktopOnly);
                }
            }
        }
 
        private void BtnExit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
 
        private void About_Click(object sender, EventArgs e)
        {
            Form about = new About();
            about.ShowDialog();
        }
 
        private void FormLogin_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (cbRemember.Checked)
            {
                Properties.Settings.Default.loginValue = cbUser.Text;
                Properties.Settings.Default.Save();
            }
            else
            {
                Properties.Settings.Default.loginValue = "";
                Properties.Settings.Default.Save();
            }
        }
    }
}
Добавлено через 2 часа 1 минуту
Уже не актуально. Проблемы были в БД.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.10.2019, 13:44
Ответы с готовыми решениями:

Форма авторизации и регистрации открывается до главной формы
Здравствуйте, делал форму авторизации по данному уроку Ссылка. Все работает отлично, но мне нужно,...

Ошибок нет, но при отладке после прохождения авторизации 2 форма не открывается
Запускаю отладку. Все запускается. Но после введения заданного логина и пароля(пользователь есть в...

Не работает форма обратной связи и форма авторизации
Не работает форма обратной связи и форма авторизации. Когда регистрируешься и нажимаешь на кнопку...

Форма авторизации и форма Регистрации(Личный кабинет)
Здравствуйте! Подскажите мне пожалуйста, как мне сделать личный кабинет после авторизации, чтобы я...

6
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
15.10.2019, 17:04 2
Цитата Сообщение от VoronReki Посмотреть сообщение
Pass_user = '" + tbPassword.Text
не храните пароли в не зашифрованном виде

И какой смысл пользователю выбирать свою роль в комбобоксе? Обычно права пользователя записываются в БД и при авторизации устанавливаются соответствующие разрешения
0
0 / 0 / 0
Регистрация: 17.10.2018
Сообщений: 51
16.10.2019, 00:26  [ТС] 3
Цитата Сообщение от meridbt Посмотреть сообщение
И какой смысл пользователю выбирать свою роль в комбобоксе? Обычно права пользователя записываются в БД и при авторизации устанавливаются соответствующие разрешения
Может примерный код подскажите? Буду крайне благодарен...
0
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
16.10.2019, 09:13 4
VoronReki,

подскажу, но для начала скажите планируется ли исключительно внутреннее использование вашего приложения собственными бухгалтерами в защищённой сети или вы хотите его распространять?
0
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
16.10.2019, 11:25 5
Пароль от БД лучше спрятать на бекэнде.

Общий принцип такой:
Форма авторизации - вне зависимости от выбранного пользака, открывается одна и та же форма


В примере используется БД MySQL, роль бекэнда играет php скрипт, принимающий в виде POST запроса логин и пароль, выполняющий проверку прав пользователя в БД и возвращающий права в виде json.

Клиент на C# отправляет POST запрос с параметрами login и password и получает в ответ доступные пользователю права или "-1" если авторизация не успешна, разбирает json в коллекцию, из которой может устанавливать необходимые разрешения внутри приложения.

Пример таблицы:
Кликните здесь для просмотра всего текста
Форма авторизации - вне зависимости от выбранного пользака, открывается одна и та же форма
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
CREATE TABLE `users` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `flag` ENUM('on','off','delete') NOT NULL DEFAULT 'on',
    `login` VARCHAR(30) NOT NULL DEFAULT '',
    `password` VARCHAR(32) NOT NULL,
    `permissions` JSON NULL DEFAULT NULL,
    PRIMARY KEY (`id`),
    UNIQUE INDEX `login` (`login`),
    INDEX `id` (`id`)
)
COLLATE='cp1251_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=3
;


Скрипт авторизации:
Кликните здесь для просмотра всего текста
PHP
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
<?php
require_once('config/dbconfig.php');
 
if (isset($_POST['login']) && isset($_POST['password'])) {
    $auth = new AuthClass();
    echo($auth->auth($_POST['login'], $_POST['password']));
    unset($auth);
}
 
class AuthClass {
    public function auth($login, $password) {
        $db = new DBUTIL(); 
        $user = $db->get_User($login);
        unset($db);
        if (!isset($user) || md5($password) != $user->password)
        {           
            return -1; 
        }
        return $user->permissions;
    }
}
 
class DBUTIL {
    
    protected $HOST = DB_HOST;
    protected $USR = DB_LOGIN;
    protected $PWD = DB_PASSWORD;
    protected $PROD = DB_PROD;
    protected $LINK;
 
    function __construct() {
        $this->LINK = mysqli_connect($this->HOST, $this->USR, $this->PWD);
        if (  !$this->LINK  )   die("Error connecting to database");
        $this->LINK->set_charset('utf8');
    }
    
    function __destruct() {
        mysqli_close($this->LINK);
    }
            
    public function get_User($login) {      
        $query = <<<EOD
            SELECT * FROM sandbox.users u           
            WHERE u.login = '$login' AND u.flag = 'on'
EOD;
        $result = mysqli_query($this->LINK, $query);
        if (!$result) die(mysqli_error());
        $user = mysqli_fetch_object($result);
        return $user;
    }
}
?>


Клиент. Через менеджер пакетов NuGet подключите Newtonsoft.Json
Кликните здесь для просмотра всего текста
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
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Net;
 
namespace VoronReki
{
    class Program
    {
 
        static string username = "valera"; // { "valera", "anton" }
        static string password = "password";
 
        static void Main(string[] args)
        {
            string permissions = Login(username, password);
            if (permissions != "-1")
            {
                List<Permission> Permissions = JsonConvert.DeserializeObject<List<Permission>>(permissions);
                foreach(Permission permission in Permissions)
                {
                    Console.WriteLine($"User {username} has {permission.Role} rights in module {permission.Module}");
                }
                Console.WriteLine($"\nRaw permissions received from backend: \n{permissions}");
            }
            else Console.WriteLine("Wrong login or password");
            Console.ReadLine();
        }
 
        private static string Login(string login, string password)
        {
            WebRequest request = WebRequest.Create("http://meridbt.monstrik.com/VoronReki/login.php");
            request.Method = "POST";
            string data = $"login={login}&password={password}";
            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(data);
            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = byteArray.Length;
 
            using (Stream dataStream = request.GetRequestStream())
            {
                dataStream.Write(byteArray, 0, byteArray.Length);
            }
 
            using (WebResponse response = request.GetResponse())
            {
                using (Stream stream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(stream))
                    {
                        return reader.ReadToEnd();
                    }
                }
            }            
        }
    }
 
    class Permission
    {
        public string Role { get; set; }
        public string Module { get; set; }
    }
}


Форма авторизации - вне зависимости от выбранного пользака, открывается одна и та же форма
0
180 / 143 / 94
Регистрация: 30.07.2013
Сообщений: 575
16.10.2019, 12:45 6
PS Если доступ к серверу будет через публичную сеть и без SSL, то лучше на бекэнд передавать md5 хэш вместо самого пароля
0
0 / 0 / 0
Регистрация: 17.10.2018
Сообщений: 51
05.12.2019, 09:36  [ТС] 7
Во-первых, я тогда часть доделал, "накрыли" другие дела, в т.ч. по работе, так что смог вернуться к программе только сейчас.
Во-вторых. никакого публичного распространения. Это "костыль" исключительно для внутреннего пользования.

Добавлено через 1 минуту
meridbt, Во-первых, я тогда часть доделал, "накрыли" другие дела, в т.ч. по работе, так что смог вернуться к программе только сейчас. Во-вторых. никакого публичного распространения. Это "костыль" исключительно для внутреннего пользования.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2019, 09:36

Логин страница в зависимости от которой открывается нужная форма (+MySql)
Здравствуйте. Задача в принципе описана в заголовке, по логину нужно определить к какому groupID...

Как сделать GUI интерфейс с несколькими вкладками/закладками, т.е существует одна форма и в зависимости от выбора вкладк
как сделать GUI интерфейс с несколькими вкладками/закладками, т.е существует одна форма и в...

Регистрационная форма и форма авторизации
Здравствуйте! Есть готовые файлы, которые работают как регистрационная форма на отдельном...

Добавление записи в Listview(1 форма) через Диалоговое окно(3 форма) другой формы (2 форма)
Всем доброго дня и с наступающими праздниками! Знаю, тема 7 частых вопросов по WinForms уже не...


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

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

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