# Spec — Authentification & Rôles

> Statut : `done`

## Intention

Gérer l'accès à l'application avec trois niveaux de rôles et une autonomie des élèves vendeurs sur le front de caisse.

## Contraintes

- Symfony Security avec le système de rôles natif.
- Trois rôles hiérarchiques : `ROLE_SUPER_ADMIN` > `ROLE_ADMIN` > `ROLE_VENDEUR`.
- Les vendeurs ne doivent jamais accéder au back-office.
- Les admins ne voient que leur association.

## Comportement attendu

### ROLE_SUPER_ADMIN
- Accès au back-office complet (toutes assos).
- Crée les associations et leurs admins.
- Pas de front de vente (pas lié à une asso).

### ROLE_ADMIN
- Accès au back-office de son association uniquement.
- Gère produits, stock, caisses, vendeurs, stats.
- Peut aussi vendre sur le front si besoin.

### ROLE_VENDEUR
- Accès au front de vente uniquement.
- Peut ouvrir/clôturer une session de caisse.
- Peut créer des ventes.
- Autonome : pas besoin d'un admin présent.

### Connexion
- Login par identifiant + mot de passe.
- Redirection post-login selon le rôle (front ou back-office).

### Mot de passe — ajouté le 2026-08-25, voir [mail.md](mail.md)
- **Oublié** : lien envoyé par e-mail, à usage unique, valable une heure. L'écran de confirmation
  ne dit jamais si l'adresse correspond à un compte.
- **Changé** : depuis le menu, en étant connecté, l'ancien mot de passe exigé. Le changement met
  fin à la session en cours.
- Un mot de passe n'est **jamais** envoyé par e-mail — seulement un lien.

## Critères de « fait »

- [x] Entité `User` avec champ `roles` et lien `Association`.
- [x] Formulaire de login fonctionnel.
- [x] Redirection post-login selon le rôle.
- [x] Accès back-office restreint à admin et super-admin.
- [x] Accès front de vente restreint aux vendeurs (et admins).
- [x] Commande console pour créer le super-admin initial.
- [x] Voters ou access control pour isoler les assos.
- [x] Mot de passe oublié et changement de mot de passe.

## Notes

Les identifiants sont créés par les admins (pas d'inscription libre). Depuis le 2026-08-25, un
membre qui perd le sien le réinitialise seul : il n'a plus à déranger son administrateur, qui
n'a plus à écrire un mot de passe quelque part pour le lui transmettre.
