Einführung
Authentifizierung ist der Prozess der Überprüfung der Identität von Benutzern bei Login-Anfragen. Bei einem Authentifizierungsprozess geben Benutzer ihre Anmeldeinformationen als Benutzernamen und Passwörter ein. Anschließend gleicht die Anwendung diese Anmeldeinformationen mit gespeicherten Datenbankeinträgen ab. Wenn es eine Übereinstimmung gibt, gewährt die Anwendung den Benutzern Zugriff auf das System.
Das Speichern von Anmeldeinformationen in einer relationalen Datenbank wie MySQL oder PostgreSQL ohne Zwischenspeicherungsmechanismus ist immer noch ein gängiger und praktischer Ansatz, birgt jedoch folgende Einschränkungen:
-
Überlastung der Datenbank. Die Anwendung muss bei jeder Login-Anfrage eines Benutzers einen Hin- und Rückweg zum Datenbankserver machen, um die Anmeldeinformationen aus einer Datenbanktabelle zu überprüfen. Da die Datenbank möglicherweise immer noch andere Lese-/Schreibzugriffsanfragen bedient, überlastet der gesamte Prozess die Datenbank und macht ihn langsam.
-
Traditionelle datenträgerbasierte Datenbanken haben Skalierbarkeitsprobleme. Wenn Ihre Anwendung Tausende von Anfragen pro Sekunde erhält, funktionieren datenträgerbasierte Datenbanken nicht optimal.
Um die oben genannten Herausforderungen zu bewältigen, können Sie Redis verwenden, um die Anmeldeinformationen der Benutzer im Cache zu speichern, damit Ihre Anwendung nicht bei jeder Anmeldeanforderung auf die Backend-Datenbank zugreifen muss. Redis ist einer der beliebtesten ultraschnellen Datenspeicher, der den RAM Ihres Computers verwendet, um Daten in Schlüssel-Wert-Paaren zu speichern. In diesem Leitfaden verwenden Sie die Redis-Datenbank, um die Sitzungsverwaltung in Ihrer Python/MySQL-Anwendung auf dem Ubuntu 22.04-Server zu beschleunigen.
Voraussetzungen
Bevor Sie mit diesem Tutorial beginnen, müssen Sie folgendes einrichten:
-
Wechseln Sie zum neuen
sudo
Benutzerkonto und installieren Sie:
Schritt 1 — Installation der Python-Datenbanktreiber für Redis und MySQL
Diese Anwendung speichert die Anmeldeinformationen der Benutzer, wie Namen und Passwörter, dauerhaft in einer MySQL-Datenbank. Beim Einloggen eines Benutzers ruft ein Python-Skript die MySQL-Datenbank ab und gleicht die Details mit den gespeicherten Werten ab. Anschließend speichert das Python-Skript die Anmeldeinformationen des Benutzers in einer Redis-Datenbank ab, um zukünftige Anfragen zu bedienen. Um diese Logik abzuschließen, benötigen Ihre Python-Skripte Treiber (Python-Module), um mit den MySQL- und Redis-Servern zu kommunizieren. Befolgen Sie die folgenden Schritte, um die Treiber zu installieren:
- Aktualisieren Sie Ihren Paketinformationsindex und führen Sie den folgenden Befehl aus, um
python3-pip
zu installieren, einen Python-Paketmanager, mit dem Sie zusätzliche Module installieren können, die nicht Teil der Python-Standardbibliothek sind.
- Installieren Sie den MySQL-Treiber für Python:
- Installieren Sie den Redis-Treiber für Python:
Nachdem Sie die erforderlichen Treiber für die Kommunikation mit MySQL und Redis installiert haben, fahren Sie mit dem nächsten Schritt fort und initialisieren Sie eine MySQL-Datenbank.
Schritt 2 – Einrichten einer Beispiel-MySQL-Datenbank
In diesem Leitfaden benötigen Sie eine MySQL-Tabelle. In einer Produktionsumgebung können Sie Dutzende von Tabellen haben, die andere Anfragen bedienen. Richten Sie eine Datenbank ein und erstellen Sie die Tabelle, indem Sie die folgenden Befehle ausführen:
-
Melden Sie sich als Benutzer
root
beim MySQL-Datenbankserver an: -
Geben Sie das
root
-Passwort Ihres MySQL-Servers ein, wenn Sie dazu aufgefordert werden, und drücken SieENTER
, um fortzufahren. Führen Sie dann den folgenden Befehl aus, um eine Beispieldatenbankcompany
und einen Benutzercompany_user
zu erstellen. Ersetzen Sieexample-mysql-password
durch ein starkes Passwort:
-
Stellen Sie sicher, dass Sie die folgende Ausgabe erhalten, um zu bestätigen, dass die vorherigen Befehle erfolgreich ausgeführt wurden:
-
Wechseln Sie zur neuen
company
Datenbank: -
Bestätigen Sie, dass Sie mit der neuen Datenbank verbunden sind, indem Sie die folgende Ausgabe überprüfen:
-
Erstellen Sie eine Tabelle
system_users
. Die Spalteuser_id
dient alsPRIMARY KEY
, um jeden Benutzer eindeutig zu identifizieren. Die Spaltenusername
undpassword
sind die Anmeldeinformationen, die Benutzer eingeben müssen, um sich in der Anwendung anzumelden. Die Spaltenfirst_name
undlast_name
speichern die Namen der Benutzer: -
Stellen Sie sicher, dass Sie die neue Tabelle erstellt haben, indem Sie die folgende Ausgabe überprüfen:
-
Füllen Sie die Tabelle
system_users
mit Beispieldaten. Verwenden Sie die integrierte MySQL-FunktionMD5(...)
, um das Passwort aus Sicherheitsgründen zu hashen: -
Überprüfen Sie die Ausgabe unten:
-
Abfragen Sie die Tabelle „system_users“, um sicherzustellen, dass die Daten vorhanden sind:
-
Überprüfen Sie die folgende Ausgabe:
-
Melden Sie sich von der MySQL-Datenbank ab:
Sie haben nun die richtige MySQL-Datenbank für Ihre Anwendung eingerichtet. Im nächsten Schritt werden Sie ein Python-Modul erstellen, das mit Ihrer Beispieldatenbank kommuniziert.
Schritt 3 – Erstellen eines zentralen MySQL-Gateway-Moduls für Python
Bei der Programmierung eines Python-Projekts sollten Sie für jede Aufgabe ein separates Modul erstellen, um die Wiederverwendbarkeit des Codes zu fördern. In diesem Schritt richten Sie ein zentrales Modul ein, das es Ihnen ermöglicht, sich von einem Python-Skript aus mit der MySQL-Datenbank zu verbinden und Abfragen durchzuführen. Befolgen Sie die folgenden Schritte:
-
Erstellen Sie ein
Projekt
-Verzeichnis. Dieses Verzeichnis trennt Ihre Python-Quellcode-Dateien von den restlichen Systemdateien: -
Wechseln Sie zum neuen
Projekt
-Verzeichnis: -
Verwenden Sie den Texteditor
nano
, um eine neue Dateimysql_db.py
zu öffnen. Diese Datei enthält das Python-Modul, das mit der MySQL-Datenbank kommuniziert: -
Geben Sie die folgenden Informationen in die Datei
mysql_db.py
ein. Ersetzen Sieexample-mysql-password
durch das korrekte MySQL-Passwort für das Kontocompany_user
:~/project/mysql_db.py -
Speichern Sie die Datei
mysql_db.py
und schließen Sie sie.
Die Moduldatei mysql_db.py
enthält eine Klasse (MysqlDb:
) mit zwei Methoden:
– db_con(self):
stellt eine Verbindung zur zuvor erstellten Beispiel-Datenbank company
her und gibt eine wiederverwendbare MySQL-Verbindung mit der Anweisung return mysql_con
zurück.
– query(self, username, password):
eine Methode, die einen username
und password
akzeptiert und die Tabelle system_users
abfragt, um festzustellen, ob es eine Übereinstimmung gibt. Die bedingte Anweisung if row_count < 1: ... else: return result[1]
gibt den booleschen Wert False
zurück, wenn ein Benutzer nicht in der Tabelle existiert, oder das Passwort des Benutzers (result[1]
), wenn die Anwendung eine Übereinstimmung findet.
Mit dem fertigen MySQL-Modul folgen Sie dem nächsten Schritt, um ein ähnliches Redis-Modul einzurichten, das mit dem Redis-Key-Value-Store kommuniziert.
Schritt 4 — Erstellen eines zentralen Redis-Moduls für Python
In diesem Schritt codieren Sie ein Modul, das eine Verbindung zum Redis-Server herstellt. Führen Sie die folgenden Schritte aus:
-
Öffnen Sie eine neue
redis_db.py
Datei: -
Geben Sie die folgenden Informationen in die Datei
redis_db.py
ein. Ersetzen Sieexample-redis-password
durch das richtige Passwort für den Redis-Server:~/Projekt/redis_db.py -
Speichern und schließen Sie die Datei
redis_db.py
.
-
Die oben genannte Datei enthält eine Klasse (
RedisDb:
). -
Unter dieser Klasse verwendet die Methode
db_con(self):
die bereitgestellten Anmeldeinformationen, um eine Verbindung zum Redis-Server herzustellen, und gibt eine wiederverwendbare Verbindung mit der Anweisungreturn redis_con
zurück.
Nachdem Sie die Redis-Klasse eingerichtet haben, erstellen Sie im nächsten Schritt die Hauptdatei für Ihr Projekt.
Schritt 5 – Erstellen des Einstiegspunkts der Anwendung
Jede Python-Anwendung muss einen Einstiegspunkt oder die Hauptdatei haben, die beim Ausführen der Anwendung ausgeführt wird. In dieser Datei erstellen Sie einen Code, der die aktuelle Serverzeit für authentifizierte Benutzer anzeigt. Diese Datei verwendet die von Ihnen erstellten benutzerdefinierten MySQL- und Redis-Module zur Authentifizierung der Benutzer. Befolgen Sie die folgenden Schritte, um die Datei zu erstellen:
-
Öffnen Sie eine neue
index.py
-Datei: -
Geben Sie die folgenden Informationen in die Datei
index.py
ein:~/projekt/index.py -
Speichern und schließen Sie die Datei
index.py
.
-
In der Datei
index.py
fügt der Abschnittimport...
die folgenden Module zu Ihrem Projekt hinzu:-
utf_8
,base64
,md5
undjson
, Textkodierung und Formatierungsmodule. -
http.server
,HTTPStatus
undsocketserver
, Webservermodule. -
datetime
, Zeit-/Datumsmodul. -
mysql_db
undredis_db
, benutzerdefinierte Module, die Sie zuvor erstellt haben, um auf die MySQL- und Redis-Server zuzugreifen.
-
-
Der
HttpHandler(http.server.SimpleHTTPRequestHandler):
ist eine Handler-Klasse für den HTTP-Server. Unterhalb der Klasse dient die Methodedo_GET(self):
dazu, HTTP-GET-Anfragen zu bedienen und das Datum/Uhrzeit des Systems für authentifizierte Benutzer anzuzeigen. -
In der
if ... : else: ...
Logik führt das Python-Skript die logische Anweisungif redis_client.exists(auth_user):
aus, um zu überprüfen, ob die Anmeldeinformationen des Benutzers im Redis-Server vorhanden sind. Wenn die Benutzerdetails existieren und das gespeicherte Redis-Passwort nicht mit dem vom Benutzer eingegebenen Passwort übereinstimmt, gibt die Anwendung den Fehler{"error": "Ungültiger Benutzername/Passwort."}
zurück.
Wenn die Benutzerdetails nicht im Redis-Server vorhanden sind, fragt die Anwendung den MySQL-Datenbankserver mit der Anweisung mysql_resp = mysql_server.query(auth_user, auth_password)
ab. Falls das vom Benutzer eingegebene Passwort nicht mit dem in der Datenbank gespeicherten Wert übereinstimmt, gibt die Anwendung den Fehler {"error": "Ungültiger Benutzername/Passwort."}
zurück. Andernfalls speichert die Anwendung die Benutzerdetails im Redis-Server mit der Anweisung redis_client.set(auth_user, mysql_resp)
.
-
In allen Fällen, in denen die Benutzerdaten mit den Redis/MySQL-Details übereinstimmen, zeigt die Anwendung das aktuelle Datum/Uhrzeit des Systems mit der Anweisung
{"time": current_time, ...}
an. Der Eintragauthorized by
in der Ausgabe ermöglicht es Ihnen, den Datenbankserver zu sehen, der die Benutzer in der Anwendung authentifiziert.
Sie haben jetzt die Hauptdatei für die Anwendung eingerichtet. Im nächsten Schritt werden Sie die Anwendung testen.
Schritt 6 — Testen der Anwendung
In diesem Schritt werden Sie Ihre Anwendung ausführen, um zu sehen, ob der Redis-Caching-Mechanismus funktioniert. Führen Sie die folgenden Befehle aus, um die Anwendung zu testen:
-
Verwenden Sie den folgenden
python3
-Befehl, um die Anwendung auszuführen: -
Stellen Sie sicher, dass der benutzerdefinierte Webserver der Anwendung ausgeführt wird:
-
Richten Sie eine neue SSH-Verbindung zu Ihrem Server in einem neuen Terminalfenster ein und führen Sie die folgenden curl-Befehle aus, um vier GET-Anfragen mit den Anmeldeinformationen von john_doe zu senden. Fügen Sie am Ende der URL http://localhost:8080/ [1-4] hinzu, um die vier Anfragen in einem einzigen Befehl zu senden:
-
Überprüfen Sie die folgenden Ausgaben. Der MySQL-Server bedient nur die erste Authentifizierungsanfrage. Dann bedient die Redis-Datenbank die nächsten drei Anfragen.
Ihre Anwendungslogik funktioniert jetzt wie erwartet.
Schlussfolgerung
In diesem Leitfaden haben Sie eine Python-Anwendung erstellt, die den Redis-Server verwendet, um die Anmeldeinformationen der Benutzer im Cache zu speichern. Redis ist ein hochverfügbarer und skalierbarer Datenbankserver, der Tausende von Transaktionen pro Sekunde durchführen kann. Mit dem Redis-Caching-Mechanismus in Ihrer Anwendung können Sie den Datenverkehr auf Ihrem Backend-Datenbankserver erheblich reduzieren. Um mehr über Redis-Anwendungen zu erfahren, besuchen Sie unsere Redis-Tutorials.