Introduzione
L’autenticazione è il processo di verifica dell’identità degli utenti durante le richieste di accesso. In un processo di autenticazione, gli utenti inviano le proprie credenziali come nome utente e password. Successivamente, l’applicazione confronta quelle credenziali di accesso con le voci memorizzate nel database. Se c’è una corrispondenza, l’applicazione concede agli utenti l’accesso al sistema.
Memorizzare le credenziali di accesso in un database relazionale come MySQL o PostgreSQL senza un meccanismo di caching è ancora un approccio comune e pratico, ma presenta i seguenti limiti:
-
Sovraccarico del database. L’applicazione deve fare un viaggio di andata e ritorno al server del database per verificare le credenziali degli utenti da una tabella del database ogni volta che un utente invia una richiesta di accesso. Poiché il database potrebbe ancora gestire altre richieste di lettura/scrittura, l’intero processo sovraccarica il database e lo rende lento.
-
I database tradizionali basati su disco hanno problemi di scalabilità. Quando la tua applicazione riceve migliaia di richieste al secondo, i database basati su disco non funzionano in modo ottimale.
Per superare le sfide di cui sopra, puoi utilizzare Redis per memorizzare nella cache le credenziali di accesso degli utenti in modo che la tua applicazione non debba contattare il database di backend durante ogni richiesta di accesso. Redis è uno dei database più popolari e ultra veloci che utilizza la RAM del tuo computer per archiviare i dati in coppie chiave-valore. In questa guida, utilizzerai il database Redis per velocizzare la gestione delle sessioni nella tua applicazione Python/MySQL su un server Ubuntu 22.04.
Prerequisiti
Prima di iniziare questo tutorial, dovrai configurare quanto segue:
-
Passa al nuovo account utente
sudo
e installa:
Passaggio 1: installazione dei driver di database Python per Redis e MySQL
Questa applicazione memorizza permanentemente le credenziali degli utenti, come nomi e password, in un server di database MySQL. Quando un utente accede all’applicazione, uno script Python interroga il database MySQL e confronta i dettagli con i valori memorizzati. Successivamente, lo script Python memorizza nella cache le credenziali di accesso dell’utente in un database Redis per servire altre richieste future. Per completare questa logica, gli script Python richiedono i driver del database (moduli Python) per comunicare con i server MySQL e Redis. Seguire i passaggi seguenti per installare i driver:
- Aggiornare l’indice delle informazioni dei pacchetti e eseguire il seguente comando per installare
python3-pip
, un gestore di pacchetti Python che consente di installare moduli aggiuntivi non inclusi nella libreria standard di Python.
- Installare il driver MySQL per Python:
- Installare il driver Redis per Python:
Dopo aver installato i driver necessari per comunicare con MySQL e Redis, procedere al passaggio successivo e inizializzare un database MySQL.
Passaggio 2 – Configurazione di un database MySQL di esempio
Per questa guida, è necessaria una tabella MySQL. In un ambiente di produzione, è possibile avere decine di tabelle che servono altre richieste. Configurare un database e creare la tabella eseguendo i seguenti comandi:
-
Accedi al server del database MySQL come utente
root
: -
Inserisci la password di
root
del tuo server MySQL quando richiesto e premiINVIO
per procedere. Quindi, esegui il seguente comando per creare un database di esempio chiamatocompany
e un account chiamatocompany_user
. Sostituisciexample-mysql-password
con una password sicura:
-
Assicurati di ricevere il seguente output per confermare che i comandi precedenti siano stati eseguiti correttamente:
-
Passa al nuovo database
company
: -
Conferma di essere connesso al nuovo database verificando il seguente output:
-
Crea una tabella
system_users
. La colonnauser_id
serve comePRIMARY KEY
per identificare univocamente ogni utente. Le colonneusername
epassword
sono le credenziali di accesso che gli utenti devono inviare per effettuare il login nell’applicazione. Le colonnefirst_name
elast_name
memorizzano i nomi degli utenti: -
Assicurati di aver creato la nuova tabella verificando l’output seguente:
-
Popola la tabella
system_users
con dati di esempio. Utilizza la funzioneMD5(...)
integrata in MySQL per criptare la password per motivi di sicurezza: -
Verificare l’output di seguito:
-
Effettuare una query sulla tabella
system_users
per assicurarsi che i dati siano stati inseriti: -
Verifica l’output seguente:
-
Esci dal database MySQL:
Ora hai configurato correttamente il database MySQL per la tua applicazione. Nel prossimo passaggio, creerai un modulo Python che comunica con il tuo database di esempio.
Passaggio 3 – Creazione di un modulo centrale per il gateway MySQL per Python
Quando si sviluppa un progetto Python, è consigliabile creare un modulo separato per ogni compito al fine di promuovere la riusabilità del codice. In questo passaggio, configurerai un modulo centrale che ti permette di connetterti e interrogare il database MySQL da uno script Python. Segui i passaggi seguenti:
-
Crea una directory
project
. Questa directory separa i file sorgente Python dal resto dei file di sistema: -
Passa alla nuova directory
project
: -
Usa l’editor di testo
nano
per aprire un nuovo filemysql_db.py
. Questo file ospita il modulo Python che comunica con il database MySQL: -
Inserisci le seguenti informazioni nel file
mysql_db.py
. Sostituisciexample-mysql-password
con la password corretta di MySQL per l’accountcompany_user
:~/project/mysql_db.py -
Salva e chiudi il file
mysql_db.py
.
Il file del modulo mysql_db.py
ha una classe (MysqlDb:
) con due metodi:
– db_con(self):
, si connette al database di esempio company
creato in precedenza e restituisce una connessione a MySQL riutilizzabile utilizzando l’istruzione return mysql_con
.
– query(self, username, password):
, un metodo che accetta un username
e una password
e interroga la tabella system_users
per verificare se c’è una corrispondenza. L’istruzione condizionale if row_count < 1: ... else: return result[1]
restituisce il valore booleano False
se un utente non esiste nella tabella o la password dell’utente (result[1]
) se l’applicazione trova una corrispondenza.
Con il modulo MySQL pronto, segui il passaggio successivo per configurare un modulo Redis simile che comunica con il database Redis chiave-valore.
Passaggio 4 – Creazione di un modulo Redis centrale per Python
In questo passaggio, scriverai un modulo che si connette al server Redis. Esegui i seguenti passaggi:
-
Apri un nuovo file
redis_db.py
: -
Inserisci le seguenti informazioni nel file
redis_db.py
. Sostituisciexample-redis-password
con la password corretta per il server Redis:~/project/redis_db.py -
Salva e chiudi il file
redis_db.py
.
-
Il file sopra riportato ha una classe (
RedisDb:
). -
Sotto questa classe, il metodo
db_con(self):
utilizza le credenziali fornite per connettersi al server Redis e restituisce una connessione riutilizzabile utilizzando l’istruzionereturn redis_con
.
Dopo aver configurato la classe Redis, crea il file principale per il tuo progetto nel passaggio successivo.
Passaggio 5: Creazione del punto di ingresso dell’applicazione
Ogni applicazione Python deve avere un punto di ingresso o il file principale che viene eseguito quando l’applicazione viene avviata. In questo file, creerai un codice che mostra l’ora corrente del server per gli utenti autenticati. Questo file utilizza i moduli personalizzati MySQL e Redis che hai creato per autenticare gli utenti. Segui i passaggi di seguito per creare il file:
-
Apri un nuovo file
index.py
: -
Inserisci le seguenti informazioni nel file
index.py
:~/progetto/index.py -
Salva e chiudi il file
index.py
.
-
Nel file
index.py
, la sezioneimport...
aggiunge i seguenti moduli al tuo progetto:-
utf_8
,base64
,md5
ejson
, moduli per la codifica e formattazione del testo. -
http.server
,HTTPStatus
esocketserver
, moduli per il server web. -
datetime
, modulo per la gestione di data e ora. -
mysql_db
eredis_db
, moduli personalizzati che hai creato in precedenza per accedere ai server MySQL e Redis.
-
-
L’
HttpHandler(http.server.SimpleHTTPRequestHandler):
è una classe gestore per il server HTTP. All’interno della classe, il metododo_GET(self):
gestisce le richieste HTTP GET e mostra la data/ora di sistema per gli utenti autenticati. -
Nella logica
if ... : else: ...
, lo script Python esegue la dichiarazione logicaif redis_client.exists(auth_user):
per verificare se le credenziali dell’utente esistono nel server Redis. Se i dettagli dell’utente esistono e la password memorizzata in Redis non corrisponde alla password inviata dall’utente, l’applicazione restituisce l’errore{"error": "Nome utente/password non validi."}
.
Se i dettagli dell’utente non esistono nel server Redis, l’applicazione interroga il server del database MySQL utilizzando l’istruzione mysql_resp = mysql_server.query(auth_user, auth_password)
. Nel caso in cui la password fornita dall’utente non corrisponda al valore memorizzato nel database, l’applicazione restituisce l’errore {"error": "Nome utente/password non validi."}
. In caso contrario, l’applicazione memorizza nella cache i dettagli dell’utente nel server Redis utilizzando l’istruzione redis_client.set(auth_user, mysql_resp)
.
- In tutti i casi in cui le credenziali dell’utente corrispondono ai dettagli di Redis/MySQL, l’applicazione visualizza la data/ora corrente del sistema utilizzando l’istruzione
{"time": current_time, ...}
. L’ingressoauthorized by
nell’output consente di vedere il server di database che autentica gli utenti nell’applicazione.
Hai ora configurato il file principale dell’applicazione. Nel prossimo passo, testerai l’applicazione.
Passaggio 6 – Test dell’applicazione
In questo passaggio, eseguirai l’applicazione per verificare se il meccanismo di caching di Redis funziona. Esegui i comandi seguenti per testare l’applicazione:
-
Utilizza il seguente comando
python3
per eseguire l’applicazione: -
Assicurati che il server web personalizzato dell’applicazione sia in esecuzione:
-
Stabilisci una nuova connessione
SSH
al tuo server in una nuova finestra del terminale e esegui i seguenti comandicurl
per inviare quattro richieste GET utilizzando le credenziali dijohn_doe
. Aggiungi[1-4]
alla fine dell’URLhttp://localhost:8080/
per inviare le quattro richieste in un singolo comando: -
Verifica i seguenti output. Il server MySQL serve solo la prima richiesta di autenticazione. Successivamente, il database Redis gestisce le tre richieste successive.
La logica dell’applicazione sta ora funzionando come previsto.
Conclusione
In questa guida, hai costruito un’applicazione Python che utilizza il server Redis per memorizzare nella cache le credenziali di accesso degli utenti. Redis è un server di database altamente disponibile e scalabile in grado di eseguire migliaia di transazioni al secondo. Con il meccanismo di memorizzazione nella cache Redis nella tua applicazione, puoi ridurre notevolmente il traffico nel tuo server di database di backend. Per saperne di più sulle applicazioni Redis, consulta i nostri tutorial Redis.