瀏覽代碼

Validación de clave en login

OscarGil03 6 月之前
父節點
當前提交
f059d41e6f
共有 4 個文件被更改,包括 42 次插入23 次删除
  1. 20 21
      lib/viewmodels/login_view_model.dart
  2. 13 2
      lib/views/login/login_screen.dart
  3. 8 0
      pubspec.lock
  4. 1 0
      pubspec.yaml

+ 20 - 21
lib/viewmodels/login_view_model.dart

@@ -1,8 +1,9 @@
 import 'package:flutter/material.dart';
-import '../data/session/session_storage.dart'; // Asegúrate de importar SessionStorage
+import '../data/session/session_storage.dart';
 import '../models/models.dart';
 import '../services/login_service.dart';
 import '../services/services.dart';
+import 'package:bcrypt/bcrypt.dart';
 
 enum Status { uninitialized, authenticated, authenticating, unauthenticated }
 
@@ -14,41 +15,39 @@ class LoginViewModel extends ChangeNotifier {
   bool _obscureText = true;
   Usuario? _usuario;
   int? _idUsuario;
-  bool _isLoading = true; // Indica si está verificando la sesión
+  bool _isLoading = true;
 
-  bool get isLoading => _isLoading; // Getter para el estado de carga
+  bool get isLoading => _isLoading;
 
   // Getters
   Usuario? get usuario => _usuario;
   Map<String, dynamic>? get errores => _errores;
 
-  Future<void> login(String correo) async {
+  Future<void> login(String correo, String contrasena) async {
     try {
       print("Iniciando proceso de login para: $correo");
 
       List<Usuario> usuarios = await RepoService<Usuario>().obtenerTodos();
-      print("Usuarios obtenidos de la base de datos: ${usuarios.length}");
-
       Usuario? usuario = usuarios.firstWhere(
         (usuario) => usuario.correo?.toLowerCase() == correo.toLowerCase(),
         orElse: () => Usuario(),
       );
 
-      // Si el correo es válido
-      if (usuario.id != 0) {
-        print("Usuario encontrado: ${usuario.correo}, ID: ${usuario.id}");
-        _status = Status.authenticated;
-        _errores = null;
-        _idUsuario = usuario.id;
-
-        // Guardar el id del usuario en SessionStorage
-        await SessionStorage().saveId(_idUsuario!);
-        print("ID guardado en SharedPreferences: $_idUsuario");
-
-        notifyListeners();
+      if (usuario.id != 0 && usuario.clave != null) {
+        bool esContrasenaValida = BCrypt.checkpw(contrasena, usuario.clave!);
+
+        if (esContrasenaValida) {
+          _status = Status.authenticated;
+          _errores = null;
+          _idUsuario = usuario.id;
+          await SessionStorage().saveId(_idUsuario!);
+          notifyListeners();
+        } else {
+          _errores = {'contrasena': 'Contraseña incorrecta'};
+          _status = Status.unauthenticated;
+          notifyListeners();
+        }
       } else {
-        print("Correo no válido: $correo");
-        hasErrors = true;
         _errores = {'correo': 'El correo no existe en el sistema'};
         _status = Status.unauthenticated;
         notifyListeners();
@@ -74,7 +73,7 @@ class LoginViewModel extends ChangeNotifier {
       _status = Status.unauthenticated;
     }
 
-    _isLoading = false; // Termina el estado de carga
+    _isLoading = false;
     notifyListeners();
   }
 

+ 13 - 2
lib/views/login/login_screen.dart

@@ -16,12 +16,14 @@ class LoginScreen extends StatefulWidget {
 
 class _LoginScreenState extends State<LoginScreen> {
   final _correo = TextEditingController();
+  final _contrasena = TextEditingController();
   Sucursal? _selectedSucursal;
 
   @override
   void dispose() {
     super.dispose();
     _correo.dispose();
+    _contrasena.dispose();
   }
 
   @override
@@ -138,6 +140,15 @@ class _LoginScreenState extends State<LoginScreen> {
                           controller: _correo,
                           keyboardType: TextInputType.emailAddress,
                         ),
+                        const SizedBox(height: 5),
+                        AppTextField(
+                          prefixIcon: const Icon(Icons.lock),
+                          etiqueta: 'Contraseña',
+                          hintText: 'Introduzca su contraseña',
+                          errorText: errores?['contrasena'],
+                          controller: _contrasena,
+                          obscureText: true,
+                        ),
                       ],
                     ),
                   ),
@@ -161,10 +172,10 @@ class _LoginScreenState extends State<LoginScreen> {
                           MaterialStatePropertyAll(AppTheme.secondary),
                     ),
                     onPressed: () async {
-                      await loginViewModel.login(_correo.text);
+                      await loginViewModel.login(
+                          _correo.text, _contrasena.text);
 
                       if (loginViewModel.status == Status.authenticated) {
-                        // Actualizar la sucursal seleccionada si el login es exitoso
                         if (_selectedSucursal != null) {
                           await sucursalViewModel
                               .setSelectedSucursal(_selectedSucursal!);

+ 8 - 0
pubspec.lock

@@ -49,6 +49,14 @@ packages:
       url: "https://pub.dev"
     source: hosted
     version: "2.2.7"
+  bcrypt:
+    dependency: "direct main"
+    description:
+      name: bcrypt
+      sha256: "9dc3f234d5935a76917a6056613e1a6d9b53f7fa56f98e24cd49b8969307764b"
+      url: "https://pub.dev"
+    source: hosted
+    version: "1.1.3"
   bidi:
     dependency: transitive
     description:

+ 1 - 0
pubspec.yaml

@@ -62,6 +62,7 @@ dependencies:
   csv: ^6.0.0
   spelling_number: ^0.0.4
   file_picker_writable: ^2.1.0+1
+  bcrypt: ^1.1.3
 
 dev_dependencies:
   flutter_test: