· Andrea Pollini · informatica · 5 min read

Autenticazione utente in Flask e Sqlite

In questo video vedremo come sviluppare un sistema di autenticazione utente in Flask e Sqlite

In questo video vedremo come sviluppare un sistema di autenticazione utente in Flask e Sqlite

La gestione sicura delle autenticazioni è un elemento cruciale per qualsiasi applicazione web. Nell’era digitale, la sicurezza delle informazioni è diventata una priorità fondamentale, e la corretta implementazione di un sistema di login rappresenta il primo baluardo nella protezione dei dati utente. In questo articolo, esploreremo come creare un sistema di login sicuro utilizzando Flask, un framework leggero per lo sviluppo web in Python, e SQLite, un database leggero e versatile.

L’uso di Flask e SQLite offre una soluzione elegante e accessibile per sviluppare applicazioni web robuste. Flask, noto per la sua semplicità e flessibilità, facilita la creazione di applicazioni web senza il peso di un framework più complesso. SQLite, d’altra parte, fornisce un database incorporato, rendendo l’intero processo più agevole, specialmente per progetti di dimensioni medio-piccole.

Durante il tutorial, esamineremo passo dopo passo come implementare il sistema di login, compreso l’hashing delle password per migliorare la sicurezza e la gestione delle sessioni per tenere traccia degli utenti autenticati. Inoltre, forniremo istruzioni dettagliate su come configurare un database SQLite per archiviare in modo sicuro le informazioni degli utenti.

Affronteremo anche concetti fondamentali, come la connessione al database prima di ogni richiesta e la sua chiusura dopo, garantendo così una gestione efficiente delle risorse. Inoltre, illustreremo l’uso di Flask per la creazione di pagine HTML dinamiche, includendo la pagina di login e quella del profilo utente.

L’obiettivo di questo articolo è fornire una guida pratica e comprensibile, adatta sia ai principianti che agli sviluppatori più esperti, che vogliono approfondire la sicurezza del sistema di login nelle loro applicazioni web. La chiarezza nell’implementazione e l’attenzione alla sicurezza sono gli elementi guida di questa guida, garantendo che i lettori acquisiscano competenze utili e una solida comprensione di come sviluppare un sistema di login efficace.

Installazione dei pacchetti necessari

Per poter sviluppare un sistema di autenticazione utente in Flask e Sqlite è necessario installare solamente il paccketto flask, in quanto Sqlite è già presente di default in Python.

pip install flask

Creazione del database

Per creare il database Sqlite è necessario creare un file con estensione .db e creare una tabella con i campi username e password.

CREATE TABLE IF NOT EXISTS users (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    username TEXT NOT NULL,
    password TEXT NOT NULL,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

Va notato che il campo id è di tipo INTEGER e PRIMARY KEY e viene incrementato automaticamente ad ogni inserimento di un nuovo utente. Il campo created_at è di tipo DATETIME e viene valorizzato con la data e l’ora corrente.

Gestione delle password in un database

Le password non devono essere salvate in chiaro all’interno del database, ma devono essere crittografate. Per fare ciò è possibile utilizzare il modulo hashlib di Python.

import hashlib

password = "password"

hashed_password = hashlib.sha256(password).hexdigest()

Questo codice genera un hash della password in chiaro, che può essere salvato all’interno del database.

Potremo quindi aprire un interprete di python e usarlo per creare l’hash della password da inserire poi nel database con un comando SQL di inserimento.

Creazione dell’applicazione Flask

Per creare l’applicazione Flask è necessario creare un file con estensione .py e inserire il seguente codice:

from flask import Flask, redirect, render_template, request, url_for,session,g
import sqlite3 as sq
import hashlib

app = Flask(__name__)


app.secret_key = b'_5#y2L"F4Q8z\n\xec]/'

# Funzione per verificare la password
def check_password(db,username, password):
    if db is None:
        return False

    cur = db.cursor()
    cur.execute("SELECT password FROM users WHERE username = ?", (username,))
    user = cur.fetchone()
    if user is None:
        return False
    return user[0] == password


@app.route("/")
def hello_world():
    return "<p>Hello, World 2!</p>"


# Funzione per aprire il database prima di ogni richiesta
@app.before_request
def before_request():
    db = sq.connect("users.db")
    g.db = db

# Funzione per chiudere il database dopo ogni richiesta
@app.after_request
def after_request(response):
    g.db.close()
    return response

@app.get("/me")
def me():
    if "username" in session:
        username = session["username"]
        return render_template("private_page.html", username=username)
    else:
        return redirect(url_for("login"))
    
@app.post("/logout")
def logout():
    session.pop("username", None)
    return redirect(url_for("login"))

@app.route("/login", methods=["GET", "POST"])
def login():
    if request.method == "GET":
        return render_template('login.html')
    else:
        username = request.form["username"]
        password = request.form["password"]

        password = hashlib.sha256(password.encode()).hexdigest()

        db = g.db
        if check_password(db,username, password):
            session["username"] = username
            return redirect(url_for("me"))
        else:
            return "<p>Wrong username or password</p>"
    

if __name__ == "__main__":
    app.run(debug=True)

Creazione delle pagine HTML

Crea due file HTML nella cartella templates all’interno del tuo progetto Flask. il primo file si chiamerà login.html e conterrà il seguente codice, che si occuperà di mostrare il form di login:

<!-- login.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form method="post" action="{{ url_for('login') }}">
        <label for="username">Username:</label>
        <input type="text" name="username" required><br>

        <label for="password">Password:</label>
        <input type="password" name="password" required><br>

        <button type="submit">Login</button>
    </form>
</body>
</html>

Il secondo file si chiamerà private_page.html e conterrà il seguente codice, che si occuperà di mostrare la pagina privata e conterrà anche il form, rappresentato da un singolo bottone, per il logout:

<!-- private_page.html -->

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Private Page</title>
</head>
<body>
    <h2>Welcome, {{ username }}!</h2>
    <form method="post" action="{{ url_for('logout') }}">
        <button type="submit">Logout</button>
    </form>
</body>
</html>

Esecuzione dell’applicazione

Per eseguire l’applicazione è necessario eseguire il seguente comando:

python app.py

A questo punto è possibile aprire il browser e digitare l’indirizzo http://127.0.0.1:5000/ per visualizzare la pagina di login. Inserendo le credenziali corrette sarà possibile accedere alla pagina privata.

Back to Blog

Related Posts

View All Posts »
Definzione di DBMS

Definzione di DBMS

Esistono diversi tipi di basi di dati, a seconda della loro struttura, della tecnologia utilizzata e del modello di dati utilizzato.

Quali sono le differenze tra "INNER JOIN" e "OUTER JOIN"

Quali sono le differenze tra "INNER JOIN" e "OUTER JOIN"

La differenza tra INNER JOIN e OUTER JOIN è uno dei concetti fondamentali della progettazione di database relazionali. In questo articolo, esaminiamo le differenze tra INNER JOIN e OUTER JOIN e quando è opportuno utilizzare ciascuno di essi.

Definizione di base di dati

Definizione di base di dati

Una base di dati è una raccolta di dati strutturati, organizzati in modo da consentire l'archiviazione, la gestione, la ricerca, l'aggiornamento e la manipolazione efficiente delle informazioni e progettati per essere usati in applicazioni differenti e da differenti utenti.

Creazione e gestione degli indici nei database SQL

Creazione e gestione degli indici nei database SQL

Gli indici SQL sono strumenti potenti per ottimizzare le prestazioni dei database relazionali. Con una comprensione approfondita dei concetti chiave, delle tecniche di creazione e gestione, e dei benefici e delle considerazioni, gli studenti e i professionisti del database possono sfruttare al meglio gli indici per garantire prestazioni efficienti e scalabili per le loro applicazioni.