Саму игру мы тут рассматривать не будем, как и переключение окон — рассмотрим лишь работу с базой пользователей. Информация о пользователях при этом находится в бинарном файле в следующем формате:
логин (25 символов), пароль (25 символов), уровень (целое), затраченное время в секундах (целое).
Загрузка и выгрузка базы пользователей
Итак, нам было бы полезно создать сущность «пользователь», хранящую всю необходимую информацию:
const int Length = 25; struct User < char name[Length]; char password[Length]; int level; int time_sec; >;
Имея такую структуру мы можем считывать/записывать данные о пользователях с файлового потока функциями read/write. Однако, с точки зрения SOLID принципов, будет правильно создать дополнительную сущность, отвечающую за работу с файлом.
struct Users < void load(); void save(); void add(const char *, const char *); User* find(const string User* find(const string password); private: vectorusers; User read_user(ifstream const string filename = «user.dat»; >;
Объект этой структуры позволяет считать данные о пользователях с файла в память (вектор) и затем — выполнять проверку наличия пользователя с заданными параметрами через поиск в векторе.
Разработка Андроид программы / #5 — Регистрация и добавление пользователя в БД
Рассмотрим возможную реализацию методов этого класса…
Метод load загружает информацию из файла в вектор, при этом если файла нет — то он создается. Для этого, если не удалось открыть файл по чтению — то он создается для записи и сразу закрывается. Созданный файл открывается по чтению.
void Users::load() < ifstream ifst(filename, ios::binary); if(!ifst) < ifst.open(filename, ios::out); ifst.close(); // TODO: copy paste ifst.open(filename, ios::binary); >ifst.seekg(0, ios::end); int n = ifst.tellg() / sizeof(User); ifst.seekg(0, ios::beg); for (int i = 0; i < n; ++i) < users.push_back(read_user(ifst)); >>
Перед тем, как считывать пользователей с файла — надо узнать их количество. Если бы мы использовали не вектор, а обычный массив — то эта информация была бы нужна чтобы выделить память под него.
Чтобы узнать количество объектов в бинарном файле — переместим указатель чтения на конец файла и посмотрим на текущую позицию. Функция tellg вернет размер файла в байтах, зная размер одного объекта — легко получить количество объектов. Однако этот подход сработает только если все объекты в файле имеют одинаковый размер (как в нашем случае).
При добавлении пользователей в базу — будем просто добавлять их в вектор, ведь чтобы добавить их в файл у нас есть функция save (сохраняющая вектор в файле).
void Users::add(const char* name, const char* password)
Функция save перебирает элементы вектора и по очереди записывает их в файловый поток:
void Users::save() < ofstream ofst; ofst.open(filename, ios::out); for (auto ofst.write((char*) >>
В функции load использовалась вспомогательная функция read_user, хотя реализовать такую операцию очень просто. Отдельная функция выделена на случай если структура пользователя изменится так, что ввод перестанет быть тривиальным — например, будет требовать динамических аллокаций памяти.
Программа подготовки документов для государственной регистрации (ППДГР)
User Users::read_user(ifstream name) < for (auto if (name == user.name) return &user; >return nullptr; > User* Users::find(const string password) < for (auto if (name == user.name password == user.password) return &user; >return nullptr; >
Этот код можно улучшить — в стандартной библиотеке есть готовая функция find_if.
Виджет авторизации и регистрации
По приведенной выше ссылке можно найти проект игры целиком, виджет авториазции был создан в QtDesigner. Варианты использования таких виджетов описаны там. В данном случае, на форме находится два поля ввода и кнопка.
Класс авторизации будет хранить внутри указатель на пользователей (объект Users). Этот объект должен создаваться где-то снаружи, например в функции main и передаваться всем классам, работающим с пользователями (виджету статистики, например). В случае успешной авторизации класс вырабатывает сигнал auth_ok, на который должны быть подписаны формы приложения, в которые должен переходить пользователь при успешной авторизации:
class AuthWidget : public QWidget < Q_OBJECT public: explicit AuthWidget(Users* users, QWidget *parent = nullptr); ~AuthWidget(); private slots: void enter(); signals: void auth_ok(const string private: Ui::AuthWidget *ui; Users* m_users; >;
В конструкторе класса соединяем сигнал нажатия кнопки со слотом:
AuthWidget::AuthWidget(Users *users, QWidget *parent) : QWidget(parent), ui(new Ui::AuthWidget), m_users(users) < ui->setupUi(this); connect(ui->enter, SIGNAL(clicked()), SLOT(enter())); >
В слоте — получаем данные введенные пользователем и выполняем поиск в базе. Если находим пару «логин-пароль» — значит произошла успешная авторизация. Если не находим такого логина — значит выполнена регистрация и авторизация. Иначе — вход не производится (сигнал auth_ok не вырабатывается).
void AuthWidget::enter() < string login = ui->login->text().toStdString(); string password = ui->password->text().toStdString(); ui->login->text().clear(); ui->password->text().clear(); User* user = m_users->find(login, password); if (nullptr != user) < emit auth_ok(login); return; >user = m_users->find(login); if (nullptr == user) < m_users->add(login.c_str(), password.c_str()); m_users->save(); emit auth_ok(login); return; > >
Источник: pro-prof.com
Как сделать систему авторизации и регистрации на PHP
Тут я расскажу как сделать систему авторизации и регистрации на чистом PHP, не каких библиотек не надо будет использовать, но эта статья подойдёт только начинающим PHP разработчиком, также файлы программы я оставлю внизу.
Перед тем как читать эту статью, рекомендую прочитать наш учебник про основы программирования на PHP (Ссылка на учебник), также у нас есть статья которая показывает как сделать регистрацию через Email (Ссылка на учебник).
Настройка базы данных:
Для начала нам надо создать и настроить базу данных, для этого заходим в PhpMyAdmin.
Создание базы данных:
Создаём базу данных, называем её user-login и выбираем кодировку utf8_general_ci.
Нажимаем кнопку, создать БД
Создание и настройка таблицы в БД:
Называем таблицу users, и настраиваем её, я не буду объяснять что каждая настройка значит, так как эта статья не о том как работать с БД, а просто покажу на скриншоте, после нажимаем сохранить.
База данных у нас готова, теперь надо подключится к ней.
Подключение БД к PHP:
Для этого создаём файлы connect.php, index.php и checkin.php. Сначала мы в connect.php подключаемся к самой БД, для этого пишем код ниже.
$server = ‘localhost’ ; // Имя или адрес сервера
$user = ‘root’ ; // Имя пользователя БД
$password = » ; // Пароль пользователя
$db = ‘authorization-system’ ; // Название БД
$db = mysqli_connect ( $server , $user , $password , $db ) ; // Подключение
// Проверка на подключение
// Если проверку не прошло, то выводится надпись ошибки и заканчивается работа скрипта
echo «Не удается подключиться к серверу базы данных!» ;
Подключаем connect.php к index.php
// Подключение БД
require _ once ‘connect.php’ ;
Проверяем скрипт, для этого запускаем программу.
После того как проверили на работа способность, можете убрать вывод надписи «подключение к базе данных прошло успешно».
Создаём регистрацию на PHP:
Для этого пишем скрипт который будет ниже:
// Проверяем нажата ли кнопка отправки формы
if ( isset ( $_REQUEST [ ‘doGo’ ] ) ) <
// Все последующие проверки, проверяют форму и выводят ошибку
// Проверка на совпадение паролей
if ( $_REQUEST [ ‘pass’ ] !== $_REQUEST [ ‘pass_rep’ ] ) <
$error = ‘Пароль не совпадает’ ;
// Проверка есть ли вообще повторный пароль
if ( ! $_REQUEST [ ‘pass_rep’ ] ) <
$error = ‘Введите повторный пароль’ ;
// Проверка есть ли пароль
if ( ! $_REQUEST [ ‘pass’ ] ) <
$error = ‘Введите пароль’ ;
// Проверка есть ли email
if ( ! $_REQUEST [ ’email’ ] ) <
$error = ‘Введите email’ ;
// Проверка есть ли логин
if ( ! $_REQUEST [ ‘login’ ] ) <
$error = ‘Введите login’ ;
// Если ошибок нет, то происходит регистрация
if ( ! $error ) <
$login = $_REQUEST [ ‘login’ ] ;
$email = $_REQUEST [ ’email’ ] ;
// Пароль хешируется
$pass = password_hash ( $_REQUEST [ ‘pass’ ] , PASSWORD_DEFAULT ) ;
// Если день рождения не был указан, то будет самый последний год из доступных
$DOB = $_REQUEST [ ‘year_of_birth’ ] ;
// Добавление пользователя
mysqli_query ( $db , «INSERT INTO `users` (`login`, `email`, `password`, `DOB`) VALUES (‘» . $login . «‘,'» . $email . «‘,'» . $pass . «‘, ‘» . $DOB . «‘)» ) ;
// Подтверждение что всё хорошо
echo ‘Регистрация прошла успешна’ ;
// Если ошибка есть, то выводить её
echo $error ;
< title >Зарегистрироваться < / title >
< p >Повторите пароль : < input type = «password» name = «pass_rep» id = «» > < samp style = «color:red» >* < / samp > < / p >
Год рождения :
$year — 14 — 100 ; $i — )
HTML я не стал рассказывать, так как, там всё понятно, да и вообще программист должен разберется в коде.
Создаём авторизацию на PHP:
Код будет очень сильно похож на файл регистрацию, но есть ряд не больших отличий.
// Проверка нажата ли кнопка отправки формы
if ( isset ( $_REQUEST [ ‘doGo’ ] ) ) <
// Последующий код проверяет вообще есть формы
// Проверяет логин
if ( ! $_REQUEST [ ‘login’ ] ) <
$error = ‘Введите логин’ ;
// Проверяет пароль
if ( ! $_REQUEST [ ‘pass’ ] ) <
$error = ‘Введите пароль’ ;
// Проверяет ошибки
if ( ! $error ) <
$login = $_REQUEST [ ‘login’ ] ;
$pass = $_REQUEST [ ‘pass’ ] ;
// берёт из БД пароль и id пользователя
if ( $result = mysqli_query ( $db , «SELECT `password`, `id` FROM `users` WHERE `login`='» . $login . «‘» ) )
while ( $row = mysqli_fetch_assoc ( $result ) ) <
// Проверяет есть ли id
if ( $row [ ‘id’ ] ) <
// если id есть, то он сравнивает пароли функцией password_verify
if ( password_verify ( $pass , $row [ ‘password’ ] ) ) <
// Если функция возвращает true, то вы входите
echo «Вы вошли» ;
// скрипт больше не выполняется
// Если функция возвращает false, то выводит ошибку
echo «Пароль не совпадает» ;
// Выводит ошибку если не нашли такой логин
echo «Ввели не верны логин» ;
// Выводит ошибки, если есть пустые поля формы
echo $error ;
Информацию о функции password_verify найдёте здесь, как видите код очень простой, но это ещё не всё, дальше вы сами напишите.
Что ещё надо сделать:
Ну, во-первых, авторизацию нельзя считать полноценной, пока данные о пользователи не будут сохранятся в браузере, для этого можно использовать куки, во-вторых, надо улучить условия принятия данных из формы, например, пропускать только определёныt символы в паролях и логинах
Вывод:
Я не стал делать всё за вас, так как программист должен сам учится всё делать и уметь находить информацию, также надо сказать, что эта статья сделана для начинающим PHP разработчикам, поэтому, более опытным, эта статья вряд ли поможет.
В будущем я напишу более продвинутую статью, о том как сделать систему авторизации и регистрации на PHP, но используя уже более продвинутые технологии.
Источник: prognote.ru
Создание системы регистрации и авторизации на PHP
Создаем базу данных в интерфейсе «phpAdmin«. Базу данных называете как вам угодно, в «Сравнение» выбираем «utf8_general_ci»:
Таблицу создавать не надо, т.к. таблица будет создаваться при регистрации пользователя.
2. Соединение с базой данных
На локальном сервере XAMPP в папке «htdocs» создаем папку нашего будущего проекта. В этой папке создаем первый php файл «db.php». Он нужен для соединения с базой данных.
Так как мы будем пользоваться библиотекой RedBeanPHP, тогда надо скачать библиотеку и подключить к проекту. Мы создадим в папке проекта папку «libs» и туда закинем библиотеку. Листинг файла db.php:
Имя пользователя для соединения c базой данных устанавливается по умолчанию (XAMPP), конечно если в phpMyAdmin вы их не меняли.
3. Создание шапки и подвала проекта
Создадим два файла и назовём их «header.php» и «footer.php». Мы их будем подключать к нашим будущим формам. В статье «PHP. Динамическое создание страниц» можно изучить для чего это необходимо. Листинг файла header.php:
Это обычная шапка проекта. Для подключения стилей создайте в проекте папку «css» и в ней создайте файл style.css, а также скачайте файл фреймворка Bootstrap и закиньте его в эту папку.
Переменная $title необходима для изменения названия страниц на разных формах (т.к. в проекте будет больше одной формы). Листинг файла footer.php:
Листинг файла style.css:
form, h2, p
4. Создание форм
С помощью HTML, CSS и Bootstrap создадим необходимые формы приложения. В папке проекта создаем форму регистрации. Файл назовём «signup.php». Листинг файла:
Форма регистрации
Зарегистрировать
Если вы зарегистрированы, тогда нажмите здесь.
Вернуться на главную.
Итоговый дизайн формы регистрации:
В папке проекта создаем форму авторизации. Файл назовём «login.php». Листинг файла:
Форма авторизации
Авторизоваться
Если вы еще не зарегистрированы, тогда нажмите здесь.
Вернуться на главную.
Итоговый дизайн формы авторизации:
Формы будут обрабатываться с помощью метода POST. Обработка форм будет в файлах с формами.
5. Обработка формы регистрации
В файле «signup.php» после подключения файла с базой данных пишем код описанный ниже. Чтобы понять код читайте комментарии к нему. Листинг:
Как видите наша регистрация безопасна на 100% т.к. есть множество различных проверок и хеширование пароля. Зарегистрировать двух пользователей с одинаковым логином и Email невозможно. Вы можете добавить и другие проверки при регистрации.
6. Обработка формы авторизации
В файле «login.php» после подключения файла с базой данных пишем код описанный ниже. Чтобы понять код читайте комментарии к нему. Листинг:
// Создаем переменную для сбора данных от пользователя по методу POST $data = $_POST; // Пользователь нажимает на кнопку «Авторизоваться» и код начинает выполняться if(isset($data[‘do_login’])) < // Создаем массив для сбора ошибок $errors = array(); // Проводим поиск пользователей в таблице users $user = R::findOne(‘users’, ‘login = ?’, array($data[‘login’])); if($user) < // Если логин существует, тогда проверяем пароль if(password_verify($data[‘password’], $user->password)) < // Все верно, пускаем пользователя $_SESSION[‘logged_user’] = $user; // Редирект на главную страницу header(‘Location: index.php’); >else < $errors[] = ‘Пароль неверно введен!’; >> else < $errors[] = ‘Пользователь с таким логином не найден!’; >if(!empty($errors)) < echo » . array_shift($errors). »; > >
Про работу $_SESSION можно почитать в нашей статье «Cookie и отслеживание сеанса«.
7. Создание главного файла приложения
Все формы и обработчики форм мы написали, а теперь создадим главный файл где будет отображаться приветствие пользователя, когда он будет авторизован. Файл назовём «index.php». Листинг:
Добро пожаловать на наш сайт!
Привет, name; ?> Выйти Авторизоваться
Регистрация
Дизайн главной страницы если пользователь не авторизован:
Дизайн главной страницы если пользователь авторизован:
Теперь создадим последний файл в нашем проекте и назовём его «logout.php». Он необходим для удаления сессии пользователя, когда он авторизован. Листинг файла:
После этого можно запустить страничку в браузере и проверить результат работы. Если Вы правильно записали, тогда все должно работать идеально, но если есть ошибки значит проверьте правильность кода.
Структура проекта в виде дерева:
На этом мы заканчиваем создание системы регистрации и авторизации на PHP. В комментариях жду Ваших предложений по доработке этого приложения. Удачи в разработке!
Источник: it-black.ru