2.3 KiB
Authentification & rôles
Login
Page : /login
L'identifiant + mot de passe sont vérifiés contre data/auth.yaml (mot de passe haché avec bcrypt).
Format auth.yaml :
credentials:
usernames:
prof.demo:
password: "$2b$12$..."
name: "Prof Demo"
role: "admin" # ou "user"
avatar_url: "/avatars/prof_demo.png"
totp_secret: "ABCD1234..." # rempli automatiquement à la 1ère 2FA
2FA TOTP (obligatoire)
À la première connexion d'un nouvel utilisateur :
- Login + mot de passe corrects
- L'app génère un secret TOTP et affiche un QR code
- L'utilisateur scanne avec Google Authenticator / Authy / 1Password / etc.
- Il saisit le code à 6 chiffres pour confirmer
- Le secret est sauvé dans
auth.yaml
Aux connexions suivantes :
- Login + mot de passe → demande directe du code TOTP
- Code à 6 chiffres → connexion finalisée
Le code est valide ±30s (paramètre valid_window=1 de pyotp) pour tolérer la dérive d'horloge.
Session persistante
L'authentification est stockée dans le localStorage du navigateur (champs username, name, role, photo_url). La session survit aux rechargements de page et aux redémarrages du conteneur.
À chaque page protégée, AuthState.check_auth re-vérifie que l'utilisateur existe toujours dans auth.yaml ; sinon, redirection forcée vers /login.
Rôles
| Page | user | admin |
|---|---|---|
/accueil |
✅ | ✅ |
/fiche |
✅ | ✅ |
/classe |
✅ | ✅ |
/doc |
✅ | ✅ |
/escada |
❌ | ✅ |
/cron |
❌ | ✅ |
/logs |
❌ | ✅ |
/users |
❌ | ✅ |
/params |
❌ | ✅ |
Gestion des utilisateurs
Page /users (admin) :
- Créer / supprimer des utilisateurs
- Changer le rôle
- Réinitialiser le 2FA (efface
totp_secret→ forcera une nouvelle config au prochain login) - Définir / changer un avatar
Logout
Bouton "Déconnexion" en bas de la sidebar. Vide le localStorage et redirige vers /login.
Stockage des avatars
Les fichiers sont sous assets/avatars/. Le chemin est référencé dans auth.yaml via avatar_url. Si avatar_url est vide, l'app affiche les initiales de name.