Files
BoursePython/app/routes/auth.py
T

57 lines
1.8 KiB
Python

from flask import Blueprint, flash, redirect, render_template, request, session, url_for
from sqlalchemy import text
from werkzeug.security import check_password_hash
from app import db
auth_bp = Blueprint("auth", __name__)
@auth_bp.route("/", methods=["GET", "POST"])
def index():
if "user_id" in session:
return redirect(url_for("menu.menu"))
if "login_attempts" not in session:
session["login_attempts"] = 0
if request.method == "POST":
user_login = request.form.get("login")
user_pass = request.form.get("pass")
query = text(
"SELECT id, pass AS user_pass, nom, prenom FROM login "
"WHERE login = :login AND actif = 1"
)
result = db.session.execute(query, {"login": user_login}).fetchone()
if result and check_password_hash(result.user_pass, user_pass):
# Régénération de session : protection contre la fixation de session
session.clear()
session["user_id"] = result.id
session["user_name"] = f"{result.prenom} {result.nom}"
session["login_attempts"] = 0
return redirect(url_for("menu.menu"))
else:
session["login_attempts"] += 1
essais = session["login_attempts"]
if essais >= 3:
session["login_attempts"] = 0
flash(
"Trop de tentatives. Réessayez dans quelques instants.",
"danger",
)
else:
flash(
f"Identifiant ou mot de passe incorrect. "
f"Il vous reste {3 - essais} essai(s).",
"danger",
)
return render_template("index.html")
@auth_bp.route("/logout")
def logout():
session.clear()
return redirect(url_for("auth.index"))