ajout auth guard
This commit is contained in:
parent
d3813bfcdb
commit
e5f7d8d2fd
@ -1,3 +1,4 @@
|
|||||||
|
import 'package:em2rp/utils/auth_guard_widget.dart';
|
||||||
import 'package:em2rp/views/calendar_page.dart';
|
import 'package:em2rp/views/calendar_page.dart';
|
||||||
import 'package:em2rp/views/login_page.dart';
|
import 'package:em2rp/views/login_page.dart';
|
||||||
import 'package:firebase_auth/firebase_auth.dart';
|
import 'package:firebase_auth/firebase_auth.dart';
|
||||||
@ -15,6 +16,8 @@ void main() async {
|
|||||||
await Firebase.initializeApp(
|
await Firebase.initializeApp(
|
||||||
options: DefaultFirebaseOptions.currentPlatform,
|
options: DefaultFirebaseOptions.currentPlatform,
|
||||||
);
|
);
|
||||||
|
await FirebaseAuth.instance.setPersistence(Persistence.LOCAL);
|
||||||
|
|
||||||
runApp(
|
runApp(
|
||||||
ChangeNotifierProvider(
|
ChangeNotifierProvider(
|
||||||
// Wrap MyApp with ChangeNotifierProvider
|
// Wrap MyApp with ChangeNotifierProvider
|
||||||
@ -31,50 +34,56 @@ class MyApp extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
print("test");
|
print("test");
|
||||||
return MaterialApp(
|
return MaterialApp(
|
||||||
title: 'EM2 ERP',
|
title: 'EM2 ERP',
|
||||||
theme: ThemeData(
|
theme: ThemeData(
|
||||||
primarySwatch: Colors.red,
|
primarySwatch: Colors.red,
|
||||||
primaryColor: AppColors.noir,
|
primaryColor: AppColors.noir,
|
||||||
colorScheme:
|
colorScheme:
|
||||||
ColorScheme.fromSwatch().copyWith(secondary: AppColors.rouge),
|
ColorScheme.fromSwatch().copyWith(secondary: AppColors.rouge),
|
||||||
textTheme: const TextTheme(
|
textTheme: const TextTheme(
|
||||||
bodyMedium: TextStyle(color: AppColors.noir),
|
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
|
enabledBorder: OutlineInputBorder(
|
||||||
inputDecorationTheme: InputDecorationTheme(
|
// Bordure par défaut (non focus)
|
||||||
focusedBorder: OutlineInputBorder(
|
borderSide:
|
||||||
// Bordure lorsqu'il est focus
|
BorderSide(color: AppColors.gris), // Couleur grise par défaut
|
||||||
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.
|
|
||||||
),
|
),
|
||||||
elevatedButtonTheme: ElevatedButtonThemeData(
|
labelStyle: TextStyle(color: AppColors.noir), // Couleur du label
|
||||||
style: ElevatedButton.styleFrom(
|
hintStyle: TextStyle(color: AppColors.gris), // Couleur du hint text
|
||||||
foregroundColor:
|
// Tu peux personnaliser d'autres propriétés ici :
|
||||||
AppColors.blanc, // Couleur du texte du bouton (ici blanc)
|
// fillColor, filled, iconColor, prefixStyle, suffixStyle, etc.
|
||||||
backgroundColor: AppColors
|
),
|
||||||
.noir, // Couleur de fond du bouton (si tu veux aussi changer le fond)
|
elevatedButtonTheme: ElevatedButtonThemeData(
|
||||||
// Autres styles possibles pour les boutons :
|
style: ElevatedButton.styleFrom(
|
||||||
// textStyle, padding, shape, elevation, etc.
|
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(),
|
routes: {
|
||||||
'/calendar': (context) => const CalendarPage(),
|
//Pages accessibles à tous
|
||||||
'/my_account': (context) => const MyAccountPage(),
|
'/login': (context) => const LoginPage(),
|
||||||
'/user_management': (context) => const UserManagementPage(),
|
|
||||||
},
|
//Pages réservées aux UTILISATEURS CONNECTÉS
|
||||||
// Conditionally set home based on authentication state
|
'/calendar': (context) => const AuthGuard(child: CalendarPage()),
|
||||||
home: LoginPage());
|
'/my_account': (context) => const AuthGuard(child: MyAccountPage()),
|
||||||
|
|
||||||
|
//Pages réservées aux ADMIN
|
||||||
|
'/user_management': (context) =>
|
||||||
|
const AuthGuard(child: UserManagementPage(), requiredRole: "ADMIN"),
|
||||||
|
},
|
||||||
|
initialRoute: '/login',
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
41
em2rp/lib/utils/auth_guard_widget.dart
Normal file
41
em2rp/lib/utils/auth_guard_widget.dart
Normal file
@ -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<UserProvider>(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;
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user