Files
Classeo/Makefile
Mathias STRASSER b823479658 feat: Gestion des sessions utilisateur
Permet aux utilisateurs de visualiser et gérer leurs sessions actives
sur différents appareils, avec la possibilité de révoquer des sessions
à distance en cas de suspicion d'activité non autorisée.

Fonctionnalités :
- Liste des sessions actives avec métadonnées (appareil, navigateur, localisation)
- Identification de la session courante
- Révocation individuelle d'une session
- Révocation de toutes les autres sessions
- Déconnexion avec nettoyage des cookies sur les deux chemins (legacy et actuel)

Sécurité :
- Cache frontend scopé par utilisateur pour éviter les fuites entre comptes
- Validation que le refresh token appartient à l'utilisateur JWT authentifié
- TTL des sessions Redis aligné sur l'expiration du refresh token
- Événements d'audit pour traçabilité (SessionInvalidee, ToutesSessionsInvalidees)

@see Story 1.6 - Gestion des sessions
2026-02-03 10:53:31 +01:00

242 lines
10 KiB
Makefile

.DEFAULT_GOAL := help
# =============================================================================
# Docker
# =============================================================================
.PHONY: up
up: ## Lancer tous les services
docker compose up -d
.PHONY: down
down: ## Arrêter tous les services
docker compose down
.PHONY: restart
restart: ## Redémarrer tous les services
docker compose down
docker compose up -d
.PHONY: rebuild
rebuild: ## Reconstruire et relancer les services (sans cache)
docker compose down
docker compose build --no-cache
docker compose up -d
.PHONY: build
build: ## Reconstruire les images Docker (sans cache)
docker compose build --no-cache
.PHONY: logs
logs: ## Voir les logs de tous les services (Ctrl+C pour quitter)
docker compose logs -f
.PHONY: ps
ps: ## Afficher le statut des services
docker compose ps
.PHONY: clean
clean: ## Supprimer volumes et images locales
docker compose down -v --rmi local
# =============================================================================
# Shell
# =============================================================================
.PHONY: shell
shell: ## Ouvrir un shell dans le container PHP
docker compose exec php sh
.PHONY: bash
bash: shell ## Alias pour 'make shell'
.PHONY: console
console: ## Exécuter une commande Symfony (ex: make console c='debug:router')
docker compose exec php php bin/console $(c)
.PHONY: shell-frontend
shell-frontend: ## Ouvrir un shell dans le container frontend
docker compose exec frontend sh
# =============================================================================
# Backend - Qualité
# =============================================================================
.PHONY: phpstan
phpstan: ## Analyse statique PHPStan (level 9)
docker compose exec php composer phpstan
.PHONY: arch
arch: ## Tests d'architecture PHPat
docker compose exec php composer arch
.PHONY: cs-fix
cs-fix: ## Corriger le code style PHP (PHP-CS-Fixer)
docker compose exec php composer cs-fix
.PHONY: cs-check
cs-check: ## Vérifier le code style PHP sans corriger
docker compose exec php composer cs-check
.PHONY: test-php
test-php: ## Lancer les tests PHPUnit
docker compose exec -e APP_ENV=test php composer test
.PHONY: warmup
warmup: ## Préchauffer le cache Symfony
docker compose exec php php bin/console cache:warmup
# =============================================================================
# Frontend - Qualité
# =============================================================================
.PHONY: lint
lint: ## Lancer ESLint sur le frontend
docker compose exec frontend pnpm run lint
.PHONY: check-types
check-types: ## Vérifier les types TypeScript (svelte-check)
docker compose exec frontend pnpm run check
.PHONY: test-js
test-js: ## Lancer les tests Vitest
docker compose exec frontend pnpm run test
.PHONY: e2e
e2e: e2e-ci e2e-ratelimit ## Lancer tous les tests E2E (CI + rate limiting)
.PHONY: e2e-ci
e2e-ci: ## Lancer les tests E2E sans rate limiting (rapide, parallèle)
docker compose exec php php bin/console cache:pool:clear cache.rate_limiter --env=dev
cd frontend && CI=true PLAYWRIGHT_BASE_URL=http://ecole-alpha.classeo.local:5174 npx playwright test
.PHONY: e2e-ratelimit
e2e-ratelimit: ## Lancer les tests de rate limiting (lent, séquentiel)
docker compose exec php php bin/console cache:pool:clear cache.rate_limiter --env=dev
cd frontend && PLAYWRIGHT_BASE_URL=http://ecole-alpha.classeo.local:5174 npx playwright test --workers=1 --grep="Rate Limiting|CAPTCHA"
# =============================================================================
# Tout-en-un
# =============================================================================
.PHONY: test
test: test-php test-js ## Lancer tous les tests (PHPUnit + Vitest)
.PHONY: check
check: phpstan cs-check lint check-types ## Lancer tous les linters et checks
.PHONY: ci
ci: ## Lancer TOUS les tests et checks (comme en CI)
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " Code Style PHP (PHP-CS-Fixer)"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@$(MAKE) cs-check
@echo ""
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " Analyse statique PHP (PHPStan level 9)"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@$(MAKE) phpstan
@echo ""
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " Tests d'architecture (PHPat)"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@$(MAKE) arch
@echo ""
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " Tests PHP (PHPUnit)"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@$(MAKE) test-php
@echo ""
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " Lint Frontend (ESLint)"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@$(MAKE) lint
@echo ""
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " Types Frontend (svelte-check)"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@$(MAKE) check-types
@echo ""
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " Tests Frontend (Vitest)"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@$(MAKE) test-js
@echo ""
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo " ✅ Tous les checks sont passés !"
@echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
@echo ""
@echo " Note: Tests E2E (make e2e) à lancer séparément depuis l'hôte"
# =============================================================================
# Scripts
# =============================================================================
.PHONY: check-bc
check-bc: ## Vérifier l'isolation des Bounded Contexts
./scripts/check-bc-isolation.sh
.PHONY: check-naming
check-naming: ## Vérifier les conventions de nommage
./scripts/check-naming.sh
.PHONY: check-tenants
check-tenants: ## Vérifier que les tenants répondent
./scripts/check-tenants.sh
# =============================================================================
# Setup initial
# =============================================================================
.PHONY: install
install: up jwt-keys warmup ## Installation complète après clone
.PHONY: jwt-keys
jwt-keys: ## Générer les clés JWT (requis après clone)
@echo "Génération des clés JWT..."
@docker compose exec php mkdir -p config/jwt
@docker compose exec php openssl genpkey -out config/jwt/private.pem -aes256 -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -pass pass:$${JWT_PASSPHRASE:-classeo_jwt_passphrase_change_me}
@docker compose exec php openssl pkey -in config/jwt/private.pem -out config/jwt/public.pem -pubout -passin pass:$${JWT_PASSPHRASE:-classeo_jwt_passphrase_change_me}
@echo "Clés JWT générées dans backend/config/jwt/"
# =============================================================================
# Dev helpers
# =============================================================================
.PHONY: token
token: ## Créer un token d'activation (interactif). Options: email=, role=, tenant=, minor=1
docker compose exec php php bin/console app:dev:create-test-activation-token \
$(if $(email),--email=$(email),) \
$(if $(role),--role=$(role),) \
$(if $(tenant),--tenant=$(tenant),) \
$(if $(minor),--minor,) \
--base-url=http://localhost:5174
.PHONY: token-alpha
token-alpha: ## Créer un token sur ecole-alpha. Options: email=, role=, minor=1
docker compose exec -T php php bin/console app:dev:create-test-activation-token -n \
--tenant=ecole-alpha --base-url=http://ecole-alpha.classeo.local:5174 \
$(if $(email),--email=$(email),--email=alpha@test.com) \
$(if $(role),--role=$(role),) \
$(if $(minor),--minor,)
.PHONY: token-beta
token-beta: ## Créer un token sur ecole-beta. Options: email=, role=, minor=1
docker compose exec -T php php bin/console app:dev:create-test-activation-token -n \
--tenant=ecole-beta --base-url=http://ecole-beta.classeo.local:5174 \
$(if $(email),--email=$(email),--email=beta@test.com) \
$(if $(role),--role=$(role),) \
$(if $(minor),--minor,)
# =============================================================================
# Help
# =============================================================================
.PHONY: help
help: ## Afficher cette aide
@echo ""
@echo " Classeo - Commandes disponibles"
@echo ""
@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf " \033[36m%-15s\033[0m %s\n", $$1, $$2}'
@echo ""