feat: Implémentation authentification NIST SP 800-63B v3.0.8

- Ajout du service PasswordSecurityService conforme NIST SP 800-63B
- Vérification des mots de passe contre la base Have I Been Pwned
- Validation : minimum 8 caractères, maximum 64 caractères
- Pas d'exigences de composition obligatoires (conforme NIST)
- Intégration dans LoginController et UserController
- Génération de mots de passe sécurisés non compromis

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-08-15 15:31:23 +02:00
parent 206c76c7db
commit 5e255ebf5e
49 changed files with 152716 additions and 149802 deletions

View File

@@ -85,6 +85,9 @@ class _AdminMapPageState extends State<AdminMapPage> {
// Référence à la boîte Hive pour les paramètres
late Box _settingsBox;
// Listener pour les changements de paramètres
late ValueListenable<Box<dynamic>> _settingsListenable;
@override
void initState() {
@@ -92,6 +95,11 @@ class _AdminMapPageState extends State<AdminMapPage> {
_initSettings().then((_) {
_loadSectors();
_loadPassages();
// Écouter les changements du secteur sélectionné
_settingsListenable = _settingsBox.listenable(keys: ['admin_selectedSectorId']);
_settingsListenable.addListener(_onSectorSelectionChanged);
// Centrer la carte une seule fois après le chargement initial
Future.delayed(const Duration(milliseconds: 100), () {
if (_selectedSectorId != null && _sectors.any((s) => s['id'] == _selectedSectorId)) {
@@ -128,7 +136,34 @@ class _AdminMapPageState extends State<AdminMapPage> {
_currentZoom = savedZoom;
}
}
// Méthode pour gérer les changements de sélection de secteur
void _onSectorSelectionChanged() {
final newSectorId = _settingsBox.get('admin_selectedSectorId');
if (newSectorId != null && newSectorId != _selectedSectorId) {
setState(() {
_selectedSectorId = newSectorId;
});
// Recharger les passages pour le nouveau secteur
_loadPassages();
// Attendre que le build soit fait puis centrer sur le secteur
WidgetsBinding.instance.addPostFrameCallback((_) {
if (_sectors.any((s) => s['id'] == _selectedSectorId)) {
_centerMapOnSpecificSector(_selectedSectorId!);
}
});
}
}
@override
void dispose() {
_settingsListenable.removeListener(_onSectorSelectionChanged);
_mapController.dispose();
super.dispose();
}
// Sauvegarder les paramètres utilisateur
void _saveSettings() {
// Sauvegarder le secteur sélectionné