Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
5 / 5 / 1
Регистрация: 08.01.2011
Сообщений: 46
1

Аутентификация в системе

08.01.2011, 20:03. Показов 3766. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте Уважаемые программисты. Пишу курсовую на QT с использованием PostgreSQL.

Задача:

Реализовать на каком-либо языке программирования прототип командного процессора, снабженного механизмом защиты на уровне пользователя с применением метода паролей или его модификаций.

Я пишу на QT с использованием PostgreSQL. Проблема возникла в пункте: "Регистрация и аутентификация в системе". Тут проблема состоит в том, что нужно реализовать такую схему:

Для каждого пользователя имеется не один пароль, а набор из нескольких, каждый раз при входе в систему, использованный пароль удаляется, если паролей не осталось доступ запрещен.
Сперва хотелось бы разобраться с тем, каким образом мне сравнивать введенные данные с хранимыми в БД. Например, для начала, с логином. А уже потом с паролями. Ниже привожу код окна авторизации:

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
#include "auth_window.h"
#include "ui_auth_window.h"
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include <QTextCodec>
#include <QMessageBox>
 
#include <QtSql>
#include <QSqlQuery>
#include <QSqlQueryModel>
 
auth_window::auth_window(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::auth_window)
{
    QTextCodec::setCodecForTr(QTextCodec::codecForName("cp1251"));
    ui->setupUi(this);
 
//= Подключаемся к базе данных ==================================
    QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
    db.setHostName("localhost");
    db.setDatabaseName("tarova_db");
    db.setUserName("belirafor");
    db.setPassword("Rdfpfh1983");
//===============================================================
 
    if(!db.open())
    {
        QMessageBox::critical(parent, QObject::tr("Ошибка"), db.lastError().text());
    }
}
 
auth_window::~auth_window()
{
    delete ui;
}
 
void auth_window::on_pushButton_login_clicked()
{
    if(ui->lineEdit_login->text() == "" || ui->lineEdit_password->text() == "")
    {
        QMessageBox::information(this,tr("Информация"), tr("Заполните все поля"));
        return;
    }
 
    else
    {
        QSqlQuery query;
        query.exec("SELECT * FROM users_tbl");
        while (query.next())
        {
//            query.value(0).toInt();
            query.value(1).toString();
//            query.value(2).toString();
//            query.value(3).toString();
        }
 
        auth_window::hide();
        MainWindow *mainwin = new MainWindow;
        mainwin->show();
    }
 
}
 
void auth_window::on_pushButton_exit_clicked()
{
    exit(0);
}
Тут приведен код SQL таблицы:
SQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE users_tbl ( 
uid SERIAL,
gid VARCHAR(1),
login VARCHAR(24), 
info_user VARCHAR(255), 
PRIMARY KEY(uid)); 
 
INSERT INTO users_tbl(gid, login, info_user) VALUES ('A', 'root', 'Это админ');
INSERT INTO users_tbl(gid, login, info_user) VALUES ('U', 'user1', 'Простой пользователь');
INSERT INTO users_tbl(gid, login, info_user) VALUES ('U', 'user2', 'Обычный пользователь');
Заранее благодарен.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
08.01.2011, 20:03
Ответы с готовыми решениями:

Аутентификация c++
Задача: Поле аутентификации чтобы логин и пасс проверялись (не через Базу данных это я еще не...

Аутентификация и авторизация
Доброго времени суток! Есть приложение, написанное на Qt, которое работает с удаленной БД. Возникла...

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

Сложение или вычитание по выбору пользователя чисел,в двоичной системе и десятичной системе
Пожалуйста помогите люди добрые.Нужно написать программу которая будет выполнять сложение или...

11
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
08.01.2011, 21:43 2
Цитата Сообщение от belirafor Посмотреть сообщение

Сперва хотелось бы разобраться с тем, каким образом мне сравнивать введенные данные с хранимыми в БД. Например, для начала, с логином.

C++
1
            query.value(1).toString();
сравнивать операцией ==
C++
1
2
QString a,b;
if (a==b) //ну и т.д.
ты же преобразуешь к QString значение поля login твоей БД, и из окна ввода логина берешь QString, вот и сравниваешь их

Добавлено через 9 минут
C++
1
if (ui->lineEdit_login->text()==query.value(1).toString()) //
0
5 / 5 / 1
Регистрация: 08.01.2011
Сообщений: 46
08.01.2011, 21:45  [ТС] 3
Хотелось бы реализовать все через SQL-запрос.
0
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
08.01.2011, 21:57 4
C++
1
2
3
query.prepare("SELECT * FROM users_tbl WHERE login=?");
query.bindValue(0,ui->lineEdit_login->text());
query.exec();
Добавлено через 3 минуты
потом проверяешь свойство query.size(), если ==0 - логин не найден.
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
09.01.2011, 08:26 5
Малюсенькое замечание. Сделайте поле логина в таблице уникальным и проверяйте на то, что найдена ровно одна запись для пользователя.
0
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
09.01.2011, 12:03 6
Цитата Сообщение от lemegeton Посмотреть сообщение
Малюсенькое замечание. Сделайте поле логина в таблице уникальным и проверяйте на то, что найдена ровно одна запись для пользователя.
думаю из-за этого Для каждого пользователя имеется не один пароль, а набор из нескольких - нет смысла так делать
0
4773 / 2582 / 894
Регистрация: 29.11.2010
Сообщений: 5,590
09.01.2011, 12:31 7
Паролей для логина может быть несколько, а вот логин должен возвращаться один, и только один. Ну, естественно, возможен вариант возврата нуля логинов. )
0
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
09.01.2011, 12:56 8
я у него второй таблицы хранящей пароли для логина, связанной с этой не вижу. получается, что в этой таблице будет несколько записей с одним логином и разными паролями
0
5 / 5 / 1
Регистрация: 08.01.2011
Сообщений: 46
10.01.2011, 01:25  [ТС] 9
По условию нужно, чтобы был список паролей для одного пользователя, не сам же я это придумал.
0
377 / 357 / 23
Регистрация: 14.12.2010
Сообщений: 1,265
10.01.2011, 01:27 10
да кто с тобой спорит. пароли пользователя в отдельной таблице будут храниться?
0
5 / 5 / 1
Регистрация: 08.01.2011
Сообщений: 46
10.01.2011, 01:33  [ТС] 11
Я сделал так:
SQL
1
2
3
4
5
6
7
8
9
10
CREATE TABLE passwd_tbl ( 
id SERIAL,
uid int4,
user_passwd VARCHAR(24),  
PRIMARY KEY(id)); 
 
INSERT INTO passwd_tbl(uid, user_passwd) VALUES ('1', 'Pfndjh1983');
INSERT INTO passwd_tbl(uid, user_passwd) VALUES ('2', 'pass1');
INSERT INTO passwd_tbl(uid, user_passwd) VALUES ('2', 'pass2');
INSERT INTO passwd_tbl(uid, user_passwd) VALUES ('2', 'pass3');
Использовал во второй таблице uid для определения принадлежности пароля к пользователю.
Сейчас не могу сделать так, чтобы записи проверялись в БД.
Вот примерно, что я накидал:
C++
1
2
3
4
5
6
7
8
QSqlQuery query;
        QString login;
        QString myQuery = "SELECT login FROM users_tbl WHERE login = ";
        myQuery += login;
        myQuery += "login_bd";
        qDebug() << myQuery;
        query.exec(myQuery);
        query.next();
0
5 / 5 / 1
Регистрация: 08.01.2011
Сообщений: 46
14.01.2011, 22:08  [ТС] 12
Вот что у меня получилось:
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
QString login;
        login = ui->lineEdit_login->text();
 
        QString password;
        password = ui->lineEdit_password->text();
 
        QSqlQuery query;
        QString myQuery = "select users_tbl.uid,password_tbl.uid from users_tbl,password_tbl where login = '";
        myQuery += login;
        myQuery += "'";
        myQuery += " and password = '";
        myQuery += password;
        myQuery += "'";
        myQuery += " and users_tbl.uid = password_tbl.uid";
        qDebug() << myQuery;
        query.exec(myQuery);
        query.next();
 
        if (query.size())
        {
        //= Выводим окно MainWindow на экран ======================
            auth_window::hide();
            MainWindow *mainwin = new MainWindow;
            mainwin->show();
        //=========================================================
Всем спасибо за помощь. =)
0
14.01.2011, 22:08
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2011, 22:08
Помогаю со студенческими работами здесь

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

Решить уравнение в двоичной системе счисления и в шестнадцатеричной системе
Добрый вечер! Написать программу на ассемблере для решения вот такого уравнения, х и у задаем...

Число а записано в p-ичной системе.Прямым делением в этой системе перевести его в систему по основанию q
Задача 1: p=5,q=16,a=2022321. Задача 2: p=15,q=6,a=13(13)(12)(14) Помогите решить,делаю типовой...

На каком расстоянии в системе К должны происходить события, чтобы в системе К´ они были одновременны?
В системе К происходит событие А, через время Dt в другой точке этой же системы происходит событие...


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

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