M
MarkGlenNov. 15, 2020, 11:23 a.m.

Qt Qml C++ PostgreSQL Login Registration form

registration, login

Вопрос в стиле "Расскажите как устроена вселенная". Но надо с чего-то начинать.

Подскажите как сделать форму регистрации и аутентификации, с чего начать, как потренироваться. Qt C++, qml, БД pgSQL. Не знаю с какой стороны подходить. Может есть какие-то мануальчики хорошие?

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

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.
16

та как), рисуем форму в поле пароля ставим тип ввода - пароль (чтоб вместо ввода были звездочки), делаем проверку на пустые поля, после нажатия кнопки проверяем связку логин/пароль, если все ок пускаем дальше, нет выводим сообщение что ошибка

M

Спасибо за ответ!)

Прекрасно, с логином разобрались, всё очень просто) На самом деле до него ещё не добрался, т.к. застрял на регистрации. Раньше я всё делал в SQLite без всяких логинов/регистраций, поэтому даже не задумывался что это целая проблема.

Проблема: как безопасно вызвать команду "CREATE USER .."? Для того чтобы создать нового юзера надо обладать правами суперпользователя, то есть надо забить в код логин/пароль суперюзера, и это какое-то бредовое направление, тут я сломался. То есть когда я до этого дошёл то понял, что на самом деле всё происходит принципиально по-другому, и путь по которому я интуитивно пошёл скорее всего не актуален лет 25 как. Так что тут у меня нет общего видения, идеологии, концепции, совокупности принципов и подходов. И нагуглить для qt/c++ получилось только сомнительные видосики индийских друзей. Продолжаю судорожно гуглить дальше.

а вы четко сформулируйте что вы делаете, чего хотите достичь на каждом этапе и чего у вас не получается. зачем создавать пользователя? к моменту обращения к БД у вас уже должна быть настроенная и сформированная база, и в конекте к ней должен быть указан логин/пароль от PostgreSQL, и уже после когода у вас есть открытое соединение вы делаете запрос в базу на проверку логина/пароля. Что-то типа:

void connect_to_db()
{
    QSqlDatabase db;
    db=QSqlDatabase::addDatabase("QPSQL","connect_name");
    db.setHostName("localhost");
    db.setDatabaseName("db_name");
    db.setUserName("user");
    db.setPort(5432);
    if(db.open())
    {
        qDebug()<<"DB opened";
    }
    else
    {
        qDebug()<<"db not open"<<db.lastError();
    }
}

bool check_login(QString login, QString pwd)
{
    QString passwd;
    QSqlQuery query(QSqlDatabase::database("connect_name"));
    QString str=QString("select passwd from users where login='%1'").arg(login);
            if (!query.exec(str))
            {
                qDebug()<<"select error " <<query.lastError()<<query.lastQuery();
            }
            while (query.next())
            {
                passwd=query_pin.value(0).toString();
            }
     if (passwd==pwd) return true;
     else return false;
}

данные о пользователе уже должны быть в базе

M

сформулируйте что вы делаете

Пользователь подключается к базе, читает информацию из нескольких таблиц базы (вопросы, справочные материалы).
Производит некоторое взаимодействие с данной информацией на своём устройстве (отвечает на вопросы, заполняет формы).
Результат взаимодействия с данной инфой (количество правильных/неправильных ответов, названия разделов с которыми работал, категории данных по которым допущены ошибки) отправляется в базу в другие таблицы ассоциированные с данным пользователем. Последнее можно конечно оставлять на устройстве, но хотелось бы забирать.

данные о пользователе уже должны быть в базе

База, с которой взаимодействует пользователь - удалённая, не на его устройстве, а в сети.

чего у вас не получается

создать форму регистрации для всех желающих

зачем создавать пользователя?

Неожиданный вопрос.. может быть действительно не нужно создавать пользователя и отдавать всю инфу целиком на устройство. Но тогда не получится собирать статистику для улучшения качества продукта, контролировать процесс, видеть вовлечённость, создавать рейтинги, много чего. Нет, нужна регистрация и авторизация как в типичном полуразвлекательном/образовательном приложении для взрослых и детей.

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

M

нельзя давать кому попало к ней доступ

Ок. Я думал это решается присваиванием пользователя группе с ограниченными правами, но видимо не всё так просто.

создать форму регистрации пользователя, по окончанию регистрации

Как происходит регистрация? Хотя бы мануальчик, ткните носом, пожалуйста! Настроить в БД Psql почтовый сервис который будет при создании записи о новом пользователе высылать на почту пароль/ID? Или решение искать в сторону QTcpServer, QTcpSocket и Qt Network? Читаю всё подряд по запросам типа "регистрация-авторизация пользователей", всё пока не приду к пониманию. Хочется конечно по привычке найти готовое решение и списать, думать совсем не хочется.

Правильно ли я понимаю решение нужно искать в сторону клиент-серверного взаимодействия, читать про QTcpServer, QTcpSocket и Qt Network? то есть уникальный id формируется на серверной стороне, оттуда же создаётся в базе запись о новом пользователе с таким-то логином-паролем и id. Пользователю отправляется инфа о его логине-пароле, после успешного ввода логина/пароля ему отправляется его id и записывается где-то в файлике, а оттуда тянется при каждом обращении к базе. Типа "показать все разделы для которых id имеет статус доступно "

передавать свой айди... подключаетесь к базе..

как-то не очевидно для меня как это должно быть организовано. пока складываются такие дурацкие кратинки

Или даже вот так

Забавные картинки))) только в дополнения к коду который приведен выше я бы пересылал в базу и логи и пароль, тобишь запрос выглядил так бы, "SELECT * FROM auth_user WHERE login=%1 AND pass=%2" так секьюритней. Ну и соответственно есть что то в селекте значит ок погнали а если нет, пишем что ключевая пара не найдена. Да не можем сказать что пользователь ошибся в пароле или в логине, но тем самым мы не передаем в ответ пароль, что в разы безопаснее, или вообще можно генерить sing и отдавать его вместо сушности юзера, но в таком случае получение его пирмишенов + 1 запрос, что при массовости не очень хорошо)

А вообще если по серьезке, то надо понимать дизайн готовго продукта, если мы говорим о сайте то тут 3 сушности, БД (1я) Сервер который реализует логику и взаимодействует с базой (рассылает письма и прочая ерись) и клиент на базе стайдлон приложения или на пример QtWebApp. Короче надо изходить от бизнес задачи а потом проектировать. Естественно что бы было удобно клиент и сервер общаются через REST или кастомный протокол, но лучше рест, на нем сейчас 90% ком пазработки

M

QtWebApp.. REST

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

Правильно ли я понимаю решение нужно искать в сторону клиент-серверного взаимодействия, читать про QTcpServer, QTcpSocket и Qt Network? то есть уникальный id формируется на серверной стороне, оттуда же создаётся в базе запись о новом пользователе с таким-то логином-паролем и id. Пользователю отправляется инфа о его логине-пароле, после успешного ввода логина/пароля ему отправляется его id и записывается где-то в файлике, а оттуда тянется при каждом обращении к базе. Типа "показать все разделы для которых id имеет статус доступно "

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

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

M

Короче говоря, поучу пока джангу, сделаю простенькое приложение на ней, гляну https://www.django-rest-framework.org/, и тогда уже продолжу страдать. Не помешает для общего развития, а то как-то всё сложновато оказалось.

В джангле не проще))) и достаточно сильно различаются подходы) Как по мне проще разобратся в плюсах чем с закидонами джанги

M

Ну хорошо. Вот прямо сейчас пойду сделаю виртуальную машину с убунтой на яндекс облаке и разобью себе об неё башку.

Кстати, как же реализовать веб интерфейс для приложения если/когда он понадобится? Всё равно нужна будет джанго.

Нет есть чудесная QtWebApp а еще один интересный проект qdjango пока не разбирался, но как понял по факту обертка

M

Да, посмотрел уже немного. Не хотелось бы сдаваться, но пока надо ещё много учиться.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
VS

C++ - Тест 003. Условия и циклы

  • Result:14points,
  • Rating points-10
VS

C++ - Тест 003. Условия и циклы

  • Result:14points,
  • Rating points-10
IP

C ++ - Test 004. Pointers, Arrays and Loops

  • Result:10points,
  • Rating points-10
Last comments
A
  • Andrey
  • April 28, 2021, 1:25 a.m.

Django - Tutorial 036. How to add authentication through social networks. VKontakte

после того как дам разрешение для просмотра моего емайл, вот такая ошибка: AuthForbidden at /social-auth/complete/vk-oauth2/ Your credentials aren't allowed Вот сетингс: SOC…
DV

Qt/C++ - Lesson 051. QMediaPlayer – simple audio player

Добрый вечер. Хотел бы получить консультацию по работе с проектом на Mac OS. Открыл проект в QT и собрал его. Проблема в том, что он не воспроизводит треки и их названия зацикленно мелькают в по…
SS

Как соответствовать новым требованиям Google Play

Добрый день. Спасибо вам огромное за вашу статью! только начинаю изучать QT под Андроид 4 дня потратил на то чтобы подобрать версию QT которая наконец то скомпилирует мне на windo…
YA

PyQt5 - Tutorial 009. Using QThread with MoveToThread

Hello. Let's say I want to send some variables to "run" define. How can we do that? I modified your code, I tried something like below, but the GUI is frozen that way. I could not be able to und…
R

Распознавание изображений на Python с помощью TensorFlow и Keras

почему то вместо 50000 обрабатывает по 782 картинки кажду. эпоху
Now discuss on the forum

Потеря данных в сигнал/слот

вопрос решен
M

Qt/QML/Android(navigation button) - Стандартные клавиши навигации Андроид

Здравствуйте, пытаюсь заставить работать стандартную андроид-клавишу "назад", пытался разными способоами, они приведены в закомментированном коде. В том числе использовал https://evileg.com/ru/f…
M

Как включить OpenGL в Adnroid эмуляторе QtCreator

Здравствуйте, у меня работают виртуальные машины с Android, но только в дефолтной был включен OpenGL. Потом я удалил дефолтную, создал новые, а в них OpenGL отключен. Справа на втором скриншоте …

QScrollArea dynamically add QCheckBoxes

Всё правильно. Это просто спамер, который отправился в вечный бан.

qml зажатая кнопка мыши в одной MouseArea и сигналы мыши из другой MouseArea

добрый, вы не пробовали отслеживать область видимости мышки через: _mouseArea.containsMouse и когда мышка будет в другой зоне видимости обрабатывать ее состояния?
About
Services
© EVILEG 2015-2021
Recommend hosting TIMEWEB