М
МаркГлен15 ноября 2020 г. 11:23

Qt Qml C++ PostgreSQL Login Registration form

registration, login

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

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

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

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

16
Алексей Внуков
  • 15 ноября 2020 г. 20:39

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

    М
    • 16 ноября 2020 г. 2:16

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

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

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

      Алексей Внуков
      • 16 ноября 2020 г. 7:15
      • (ред.)

      а вы четко сформулируйте что вы делаете, чего хотите достичь на каждом этапе и чего у вас не получается. зачем создавать пользователя? к моменту обращения к БД у вас уже должна быть настроенная и сформированная база, и в конекте к ней должен быть указан логин/пароль от 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;
      }
      

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

        М
        • 16 ноября 2020 г. 7:51

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

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

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

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

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

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

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

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

          Алексей Внуков
          • 16 ноября 2020 г. 13:07
          • (ред.)

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

            М
            • 16 ноября 2020 г. 15:11

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

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

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

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

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

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

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

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

              Alexander
              • 16 ноября 2020 г. 15:25
              • (ред.)

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

                Alexander
                • 16 ноября 2020 г. 15:34

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

                  М
                  • 16 ноября 2020 г. 15:54

                  QtWebApp.. REST

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

                    Алексей Внуков
                    • 17 ноября 2020 г. 3:49

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

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

                      Alexander
                      • 17 ноября 2020 г. 6:07

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

                        М
                        • 19 ноября 2020 г. 1:07

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

                          Alexander
                          • 19 ноября 2020 г. 1:11

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

                            М
                            • 19 ноября 2020 г. 1:49

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

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

                              Alexander
                              • 29 ноября 2020 г. 17:12

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

                                М
                                • 1 декабря 2020 г. 0:06

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

                                  Комментарии

                                  Только авторизованные пользователи могут публиковать комментарии.
                                  Пожалуйста, авторизуйтесь или зарегистрируйтесь
                                  B

                                  C++ - Тест 002. Константы

                                  • Результат:16баллов,
                                  • Очки рейтинга-10
                                  B

                                  C++ - Тест 001. Первая программа и типы данных

                                  • Результат:46баллов,
                                  • Очки рейтинга-6
                                  FL

                                  C++ - Тест 006. Перечисления

                                  • Результат:80баллов,
                                  • Очки рейтинга4
                                  Последние комментарии
                                  k
                                  kmssr8 февраля 2024 г. 15:43
                                  Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                                  АК
                                  Анатолий Кононенко4 февраля 2024 г. 22:50
                                  Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                                  EVA
                                  EVA25 декабря 2023 г. 7:30
                                  Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                                  J
                                  JonnyJo25 декабря 2023 г. 5:38
                                  Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                                  G
                                  Gvozdik18 декабря 2023 г. 18:01
                                  Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                                  Сейчас обсуждают на форуме
                                  P
                                  Pisych27 февраля 2023 г. 1:04
                                  Как получить в массив значения из связанной модели? Спасибо, разобрался:))
                                  AC
                                  Alexandru Codreanu19 января 2024 г. 8:57
                                  QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…
                                  BlinCT
                                  BlinCT27 декабря 2023 г. 5:57
                                  Растягивать Image на парент по высоте Ну и само собою дял включения scrollbar надо чтобы был Flickable. Так что выходит как то так Flickable{ id: root anchors.fill: parent clip: true property url linkFile p…
                                  Дмитрий
                                  Дмитрий10 января 2024 г. 1:18
                                  Qt Creator загружает всю оперативную память Проблема решена. Удалось разобраться с помощью утилиты strace. Запустил ее: strace ./qtcreator Начал выводиться весь лог работы креатора. В один момент он начал считывать фай…
                                  Evgenii Legotckoi
                                  Evgenii Legotckoi12 декабря 2023 г. 3:48
                                  Побуквенное сравнение двух строк Добрый день. Там случайно не высылается этот сигнал textChanged ещё и при форматировани текста? Если решиать в лоб, то можно просто отключать сигнал/слотовое соединение внутри слота и …

                                  Следите за нами в социальных сетях