From e5f7d8d2fd1051e448febf4e62ea95cd568341a2 Mon Sep 17 00:00:00 2001 From: "PC-PAUL\\paulf" Date: Wed, 5 Mar 2025 20:32:39 +0100 Subject: [PATCH] ajout auth guard --- em2rp/lib/main.dart | 91 ++++++++++++++------------ em2rp/lib/utils/auth_guard_widget.dart | 41 ++++++++++++ 2 files changed, 91 insertions(+), 41 deletions(-) create mode 100644 em2rp/lib/utils/auth_guard_widget.dart diff --git a/em2rp/lib/main.dart b/em2rp/lib/main.dart index 9cc0d71..16a7b8d 100644 --- a/em2rp/lib/main.dart +++ b/em2rp/lib/main.dart @@ -1,3 +1,4 @@ +import 'package:em2rp/utils/auth_guard_widget.dart'; import 'package:em2rp/views/calendar_page.dart'; import 'package:em2rp/views/login_page.dart'; import 'package:firebase_auth/firebase_auth.dart'; @@ -15,6 +16,8 @@ void main() async { await Firebase.initializeApp( options: DefaultFirebaseOptions.currentPlatform, ); + await FirebaseAuth.instance.setPersistence(Persistence.LOCAL); + runApp( ChangeNotifierProvider( // Wrap MyApp with ChangeNotifierProvider @@ -31,50 +34,56 @@ class MyApp extends StatelessWidget { Widget build(BuildContext context) { print("test"); return MaterialApp( - title: 'EM2 ERP', - theme: ThemeData( - primarySwatch: Colors.red, - primaryColor: AppColors.noir, - colorScheme: - ColorScheme.fromSwatch().copyWith(secondary: AppColors.rouge), - textTheme: const TextTheme( - bodyMedium: TextStyle(color: AppColors.noir), + title: 'EM2 ERP', + theme: ThemeData( + primarySwatch: Colors.red, + primaryColor: AppColors.noir, + colorScheme: + ColorScheme.fromSwatch().copyWith(secondary: AppColors.rouge), + textTheme: const TextTheme( + bodyMedium: TextStyle(color: AppColors.noir), + ), + // Personnalisation de l'InputDecorationTheme pour les text fields + inputDecorationTheme: InputDecorationTheme( + focusedBorder: OutlineInputBorder( + // Bordure lorsqu'il est focus + borderSide: + BorderSide(color: AppColors.noir), // Couleur rouge quand focus ), - // Personnalisation de l'InputDecorationTheme pour les text fields - inputDecorationTheme: InputDecorationTheme( - focusedBorder: OutlineInputBorder( - // Bordure lorsqu'il est focus - borderSide: BorderSide( - color: AppColors.noir), // Couleur rouge quand focus - ), - enabledBorder: OutlineInputBorder( - // Bordure par défaut (non focus) - borderSide: - BorderSide(color: AppColors.gris), // Couleur grise par défaut - ), - labelStyle: TextStyle(color: AppColors.noir), // Couleur du label - hintStyle: TextStyle(color: AppColors.gris), // Couleur du hint text - // Tu peux personnaliser d'autres propriétés ici : - // fillColor, filled, iconColor, prefixStyle, suffixStyle, etc. + enabledBorder: OutlineInputBorder( + // Bordure par défaut (non focus) + borderSide: + BorderSide(color: AppColors.gris), // Couleur grise par défaut ), - elevatedButtonTheme: ElevatedButtonThemeData( - style: ElevatedButton.styleFrom( - foregroundColor: - AppColors.blanc, // Couleur du texte du bouton (ici blanc) - backgroundColor: AppColors - .noir, // Couleur de fond du bouton (si tu veux aussi changer le fond) - // Autres styles possibles pour les boutons : - // textStyle, padding, shape, elevation, etc. - ), + labelStyle: TextStyle(color: AppColors.noir), // Couleur du label + hintStyle: TextStyle(color: AppColors.gris), // Couleur du hint text + // Tu peux personnaliser d'autres propriétés ici : + // fillColor, filled, iconColor, prefixStyle, suffixStyle, etc. + ), + elevatedButtonTheme: ElevatedButtonThemeData( + style: ElevatedButton.styleFrom( + foregroundColor: + AppColors.blanc, // Couleur du texte du bouton (ici blanc) + backgroundColor: AppColors + .noir, // Couleur de fond du bouton (si tu veux aussi changer le fond) + // Autres styles possibles pour les boutons : + // textStyle, padding, shape, elevation, etc. ), ), - routes: { - '/login': (context) => const LoginPage(), - '/calendar': (context) => const CalendarPage(), - '/my_account': (context) => const MyAccountPage(), - '/user_management': (context) => const UserManagementPage(), - }, - // Conditionally set home based on authentication state - home: LoginPage()); + ), + routes: { + //Pages accessibles à tous + '/login': (context) => const LoginPage(), + + //Pages réservées aux UTILISATEURS CONNECTÉS + '/calendar': (context) => const AuthGuard(child: CalendarPage()), + '/my_account': (context) => const AuthGuard(child: MyAccountPage()), + + //Pages réservées aux ADMIN + '/user_management': (context) => + const AuthGuard(child: UserManagementPage(), requiredRole: "ADMIN"), + }, + initialRoute: '/login', + ); } } diff --git a/em2rp/lib/utils/auth_guard_widget.dart b/em2rp/lib/utils/auth_guard_widget.dart new file mode 100644 index 0000000..7b13176 --- /dev/null +++ b/em2rp/lib/utils/auth_guard_widget.dart @@ -0,0 +1,41 @@ +import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; +import 'package:em2rp/providers/user_provider.dart'; +import 'package:em2rp/views/login_page.dart'; + +class AuthGuard extends StatelessWidget { + final Widget child; + final String? + requiredRole; // Si non null, la page est réservée à ce rôle (ex: "ADMIN") + + const AuthGuard({ + Key? key, + required this.child, + this.requiredRole, + }) : super(key: key); + + @override + Widget build(BuildContext context) { + final userProvider = Provider.of(context); + + // Si l'utilisateur n'est pas connecté (aucun uid ou email) + if (userProvider.uid == null || userProvider.email == null) { + // Retourne la page de connexion. + // Vous pouvez aussi déclencher une redirection automatique si nécessaire. + return const LoginPage(); + } + + // Si la page requiert un rôle spécifique et que l'utilisateur ne le possède pas + if (requiredRole != null && userProvider.role != requiredRole) { + return Scaffold( + appBar: AppBar(title: const Text("Accès refusé")), + body: const Center( + child: Text("Vous n'êtes pas autorisé à accéder à cette page."), + ), + ); + } + + // Sinon, afficher la page demandée + return child; + } +}