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

@@ -1,5 +1,6 @@
import 'package:geosector_app/app.dart'; // Pour accéder aux instances globales
import 'package:flutter/material.dart';
import 'package:hive/hive.dart';
import 'package:geosector_app/core/constants/app_keys.dart';
import 'package:geosector_app/core/data/models/passage_model.dart';
import 'package:geosector_app/core/data/models/sector_model.dart';
@@ -84,6 +85,8 @@ class _AdminHistoryPageState extends State<AdminHistoryPage> {
super.initState();
// Initialiser les filtres
_initializeFilters();
// Charger les filtres présélectionnés depuis Hive si disponibles
_loadPreselectedFilters();
}
@override
@@ -172,6 +175,40 @@ class _AdminHistoryPageState extends State<AdminHistoryPage> {
selectedDateRange = null;
}
// Charger les filtres présélectionnés depuis Hive
void _loadPreselectedFilters() {
try {
// Utiliser Hive directement sans async
if (Hive.isBoxOpen(AppKeys.settingsBoxName)) {
final settingsBox = Hive.box(AppKeys.settingsBoxName);
// Charger le secteur présélectionné
final int? preselectedSectorId = settingsBox.get('history_selectedSectorId');
final String? preselectedSectorName = settingsBox.get('history_selectedSectorName');
final int? preselectedTypeId = settingsBox.get('history_selectedTypeId');
if (preselectedSectorId != null && preselectedSectorName != null) {
selectedSectorId = preselectedSectorId;
selectedSector = preselectedSectorName;
debugPrint('Secteur présélectionné: $preselectedSectorName (ID: $preselectedSectorId)');
}
if (preselectedTypeId != null) {
selectedType = preselectedTypeId.toString();
debugPrint('Type de passage présélectionné: $preselectedTypeId');
}
// Nettoyer les valeurs après utilisation pour ne pas les réutiliser la prochaine fois
settingsBox.delete('history_selectedSectorId');
settingsBox.delete('history_selectedSectorName');
settingsBox.delete('history_selectedTypeId');
}
} catch (e) {
debugPrint('Erreur lors du chargement des filtres présélectionnés: $e');
}
}
@override
void dispose() {
_searchController.dispose();