Введение
Аутентификация – это процесс проверки личности пользователей во время запросов на вход. В процессе аутентификации пользователи предоставляют свои учетные данные в виде имен пользователей и паролей. Затем приложение сопоставляет эти учетные данные с записями, хранящимися в базе данных. При наличии соответствия приложение предоставляет пользователям доступ к системе.
Хранение учетных данных в реляционной базе данных, такой как MySQL или PostgreSQL, без механизма кэширования, по-прежнему является распространенным и практичным подходом, но он сопряжен с определенными ограничениями:
-
Перегрузка базы данных. Приложение должно сделать круговой обра тно-поступательный запрос к серверу базы данных для проверки учетных данных пользователей из таблицы базы данных при каждом запросе на вход пользователя. Поскольку база данных может все еще обслуживать другие запросы на чтение/запись, весь процесс перегружает базу данных и замедляет его работу.
-
У традиционных дисковых баз данных есть проблемы масштабируемости. Когда ваше приложение получает тысячи запросов в секунду, дисковые базы данных не работают оптимально.
Для преодоления вышеупомянутых проблем вы можете использовать Redis для кеширования учетных данных пользователей, чтобы ваше приложение не обращалось к базе данных каждый раз при запросе на вход. Redis является одним из самых популярных сверхбыстрых хранилищ данных, использующим оперативную память вашего компьютера для хранения данных в форме пар ключ-значение. В этом руководстве вы будете использовать базу данных Redis для ускорения обработки сеансов в вашем приложении на Python/MySQL на сервере Ubuntu 22.04.
Предварительные требования
Прежде чем начать этот учебник, вам нужно настроить следующее:
-
Переключитесь на новую учетную запись пользователя
sudo
и установите:
Шаг 1 — Установка драйверов базы данных Python для Redis и MySQL
Это приложение постоянно хранит учетные данные пользователей, такие как имена и пароли, в базе данных сервера MySQL. Когда пользователь входит в приложение, сценарий на языке Python запрашивает базу данных MySQL и сопоставляет детали с сохраненными значениями. Затем сценарий на языке Python кеширует учетные данные входа пользователя в базе данных Redis для обслуживания других будущих запросов. Для завершения этой логики ваши сценарии на языке Python требуют драйверы базы данных (модули Python) для взаимодействия с серверами MySQL и Redis. Следуйте указанным ниже шагам для установки драйверов:
- Обновите свой индекс информации о пакете и выполните следующую команду для установки
python3-pip
, менеджера пакетов Python, который позволяет устанавливать дополнительные модули, не входящие в стандартную библиотеку Python.
- Установите драйвер MySQL для Python:
- Установите драйвер Redis для Python:
После установки необходимых драйверов для взаимодействия с MySQL и Redis переходите к следующему шагу и инициализируйте базу данных MySQL.
Шаг 2 — Настройка примера базы данных MySQL
Для этого руководства вам потребуется одна таблица MySQL. В производственной среде вы можете иметь десятки таблиц, обслуживающих другие запросы. Создайте базу данных и таблицу, выполнив следующие команды:
-
Войдите на сервер баз данных MySQL как пользователь
root
: -
Введите пароль для сервера MySQL
root
, когда будет запрошен, и нажмитеENTER
, чтобы продолжить. Затем выполните следующую команду, чтобы создать пример базы данныхcompany
и учетную записьcompany_user
. Заменитеexample-mysql-password
на надежный пароль:
-
Убедитесь, что вы получаете следующий вывод, чтобы подтвердить успешное выполнение предыдущих команд:
-
Переключитесь на новую базу данных
company
: -
Подтвердите, что вы подключены к новой базе данных, проверив следующий вывод:
-
Создайте таблицу
system_users
. Столбецuser_id
служит в качествеPRIMARY KEY
для уникальной идентификации каждого пользователя. Столбцыusername
иpassword
представляют собой учетные данные, которые пользователи должны предоставить для входа в приложение. Столбцыfirst_name
иlast_name
хранят имена пользователей: -
Убедитесь, что вы создали новую таблицу, проверив следующий вывод:
-
Заполните таблицу
system_users
тестовыми данными. Используйте встроенную функциюMD5(...)
MySQL для хеширования пароля в целях безопасности: -
Проверьте результат ниже:
-
Запросите таблицу
system_users
, чтобы удостовериться, что данные на месте: -
Проверьте следующий вывод:
-
Выйти из базы данных MySQL:
Теперь вы настроили правильную базу данных MySQL для вашего приложения. На следующем шаге вы создадите модуль Python, взаимодействующий с вашей примерной базой данных.
Шаг 3 — Создание центрального модуля шлюза MySQL для Python
При написании любого проекта на Python вы должны создать отдельный модуль для каждой задачи, чтобы обеспечить повторное использование кода. На этом шаге вы настроите центральный модуль, который позволит вам подключаться и выполнять запросы к базе данных MySQL из скрипта на Python. Следуйте инструкциям ниже:
-
Создайте каталог
project
. Этот каталог отделяет ваши файлы исходного кода Python от остальных системных файлов: -
Перейдите в новый каталог
project
: -
Используйте текстовый редактор
nano
, чтобы открыть новый файлmysql_db.py
. В этом файле находится модуль Python, взаимодействующий с базой данных MySQL: -
Введите следующую информацию в файл
mysql_db.py
. Заменитеexample-mysql-password
на правильный пароль MySQL для учетной записиcompany_user
:~/project/mysql_db.py -
Сохраните и закройте файл
mysql_db.py
.
Модульный файл mysql_db.py
содержит один класс (MysqlDb:
) с двумя методами:
– db_con(self):
подключается к созданной ранее базе данных company
и возвращает повторно используемое соединение MySQL с помощью оператора return mysql_con
.
– query(self, username, password):
– метод, который принимает имя пользователя (username
) и пароль (password
) и запрашивает таблицу system_users
, чтобы определить, существует ли совпадение. Условный оператор if row_count < 1: ... else: return result[1]
возвращает логическое значение False
, если пользователя нет в таблице, или пароль пользователя (result[1]
), если приложение находит совпадение.
После того, как модуль MySQL готов, перейдите к следующему шагу для настройки аналогичного модуля Redis, который взаимодействует с хранилищем ключ-значение Redis.
Шаг 4 — Создание центрального модуля Redis для Python
На этом шаге вы напишете модуль, который подключается к серверу Redis. Выполните следующие шаги:
-
Откройте новый файл
redis_db.py
: -
Введите следующую информацию в файл
redis_db.py
. Заменитеexample-redis-password
на правильный пароль для сервера Redis:~/project/redis_db.py -
Сохраните и закройте файл
redis_db.py
.
-
В вышеприведенном файле есть один класс (
RedisDb:
). -
Под этим классом метод
db_con(self):
использует предоставленные учетные данные для подключения к серверу Redis и возвращает повторно используемое соединение с помощью оператораreturn redis_con
.
После настройки класса Redis перейдите к следующему шагу, создав основной файл для вашего проекта.
Шаг 5 — Создание точки входа в приложение
У каждого приложения на Python должна быть точка входа или основной файл, который выполняется при запуске приложения. В этом файле вы создадите код, который показывает текущее время сервера для аутентифицированных пользователей. Этот файл использует пользовательские модули MySQL и Redis, созданные вами, для аутентификации пользователей. Чтобы создать файл, выполните следующие шаги:
-
Откройте новый файл
index.py
: -
Введите следующую информацию в файл
index.py
:~/project/index.py -
Сохраните и закройте файл
index.py
.
-
В файле
index.py
в разделеimport...
добавьте следующие модули в ваш проект:-
utf_8
,base64
,md5
иjson
, модули кодирования и форматирования текста. -
http.server
,HTTPStatus
иsocketserver
, модули веб-сервера. -
datetime
, модуль времени/даты. -
mysql_db
иredis_db
, пользовательские модули, которые вы ранее создали для доступа к серверам MySQL и Redis.
-
-
Класс
HttpHandler(http.server.SimpleHTTPRequestHandler):
является классом обработчика для HTTP-сервера. Внутри класса методdo_GET(self):
обрабатывает запросы HTTP GET и отображает дату/время системы для аутентифицированных пользователей. -
В логике
if ... : else: ...
скрипт на Python выполняет логическое выражениеif redis_client.exists(auth_user):
для проверки существования учетных данных пользователя в сервере Redis. Если данные пользователя существуют и сохраненный в Redis пароль не совпадает с предоставленным пользователем паролем, приложение возвращает ошибку{"error": "Invalid username/password."}
.
Если сведения о пользователе отсЕутслиствую данныет в пользователя не сервер сеуществ Redisуют, при в серверложеение Redis зап,ра пришложивениеает сервер зап базраы данныхш MySQLив,ает использ серверу базяы данных опер MySQLатор с < использованиcodeем>mysql оператор_respа = < mysqlcode_server>.querymysql_resp (auth = mysql_server_user.query(auth,_user auth,_password auth).code В случ>. Вае случ еслиае если предоставленный пользовател предостемавленный пользователем пар парольоль не со неответ соответствуетствует знач значениениюю, хран, храняящщемемуусяся в баз в базе данныхе, данных, при приложение вложозвращает ошибкуение < возвращаетcode ошибку <>{“code>{“errorerror”:”: “Invalid username/password “.”}. username/password В.” прот}. случа В преот,ив приложном случениеа кэеши приложруетение данные к пользователяэши нару серверете с Redisвед сения о использов пользователе вани сервереме опер Redisатора, использ <уcodeя> оперredisатор_client.set(auth
-
Во всех случаях, когда учетные данные пользователя совпадают с данными Redis/MySQL, приложение отображает текущую дату/время системы с использованием выражения
{"time": текущее_время, ...}
. Записьauthorized by
в выводе позволяет видеть сервер базы данных, который аутентифицирует пользователей в приложении.
Вы теперь настроили основной файл для приложения. На следующем шаге вы протестируете приложение.
Шаг 6 — Тестирование Приложения
На этом шаге вы запустите приложение, чтобы убедиться, что механизм кэширования Redis работает. Выполните нижеприведенные команды, чтобы протестировать приложение:
-
Используйте следующую команду
python3
, чтобы запустить приложение: -
Убедитесь, что пользовательский веб-сервер приложения запущен:
-
Установите еще одно
SSH
-соединение с вашим сервером в новом окне терминала и выполните следующие командыcurl
, чтобы отправить четыре запроса GET с использованием учетных данныхjohn_doe
. Добавьте[1-4]
в конце URLhttp://localhost:8080/
, чтобы отправить четыре запроса одной командой: -
Проверьте следующие выводы. Сервер MySQL обслуживает только первый запрос аутентификации. Затем база данных Redis обслуживает следующие три запроса.
Логика вашего приложения теперь работает как ожидается.
Заключение
В этом руководстве вы создали приложение на Python, использующее сервер Redis для кэширования учетных данных пользователей. Redis – это высокодоступный и масштабируемый сервер базы данных, способный выполнять тысячи транзакций в секунду. С механизмом кэширования Redis в вашем приложении вы можете значительно снизить трафик на сервере вашей базы данных. Для получения дополнительной информации о приложениях Redis обратитесь к нашим учебным пособиям по Redis.