File "AutenticacionControlador.php"
Full Path: C:/wamp64/www/Formaciones/Controladores/AutenticacionControlador.php
File size: 5.67 KB
MIME-type: text/x-php
Charset: utf-8
<?php
// Controladores/AutenticacionControlador.php
require_once 'Modelos/UsuarioModelo.php';
class AutenticacionControlador {
private $modelo;
// Clave secreta para la validación en el servidor
private const RECAPTCHA_SECRET_KEY = '6LcUafsrAAAAAL2xMNSvimYvzrMlC3YFSgUJGQPx';
public function __construct($db, $db_externa) {
$this->modelo = new UsuarioModelo($db, $db_externa);
}
public function mostrarLogin() {
if (isset($_SESSION['user_id'])) {
header("Location: index.php?r=dashboard");
exit;
}
require_once 'Vistas/autenticacion/login.php';
}
public function procesar() {
// 1. VALIDACIÓN DEL RECAPTCHA
$recaptchaResponse = $_POST['g-recaptcha-response'] ?? '';
if (empty($recaptchaResponse)) {
$_SESSION['flash_error'] = "Por favor, completa la verificación de seguridad.";
header("Location: index.php?r=auth/login");
exit;
}
// Llamada a la API de Google
$url = 'https://www.google.com/recaptcha/api/siteverify';
$params = [
'secret' => self::RECAPTCHA_SECRET_KEY,
'response' => $recaptchaResponse,
'remoteip' => $_SERVER['REMOTE_ADDR']
];
$options = [
'http' => [
'header' => "Content-type: application/x-www-form-urlencoded\r\n",
'method' => 'POST',
'content' => http_build_query($params)
]
];
$context = stream_context_create($options);
$verify = file_get_contents($url, false, $context);
$captchaSuccess = json_decode($verify);
if (!$captchaSuccess->success) {
$_SESSION['flash_error'] = "La verificación de seguridad falló. Inténtalo de nuevo.";
header("Location: index.php?r=auth/login");
exit;
}
// 2. CONTINUAR CON EL LOGIN NORMAL (Si el CAPTCHA es válido)
$cedula = trim($_POST['cedula'] ?? '');
if (empty($cedula)) {
$_SESSION['flash_error'] = "Por favor ingresa tu cédula";
header("Location: index.php?r=auth/login");
exit;
}
$empleado = $this->modelo->buscarEnNomina($cedula);
if (!$empleado) {
$_SESSION['flash_error'] = "Cédula no encontrada en el sistema de nómina";
header("Location: index.php?r=auth/login");
exit;
}
$usuario = $this->modelo->buscarLocal($cedula);
if (!$usuario) {
$this->modelo->registrarLocal([
'nombre' => $empleado['nombre'],
'apellido' => $empleado['apellido'],
'cedula' => $empleado['cedula'],
'ccosto' => $empleado['ccosto'],
'cargo' => $empleado['cargo']
]);
$usuario = $this->modelo->buscarLocal($cedula);
}
// Si es admin o instructor, redirigir al segundo paso
if ($usuario['role'] === 'admin' || $usuario['role'] === 'instructor') {
$_SESSION['pending_cedula'] = $usuario['cedula'];
$_SESSION['pending_empleado'] = $usuario;
header("Location: index.php?r=auth/login-admin");
exit;
}
// Si es student, ingresar directamente
$this->crearSesion($usuario);
header("Location: index.php?r=dashboard");
exit;
}
// 3. Muestra el segundo formulario (Email y Password)
public function mostrarLoginAdmin() {
if (!isset($_SESSION['pending_cedula'])) {
header("Location: index.php?r=auth/login");
exit;
}
require_once 'Vistas/autenticacion/loginAdmin.php';
}
// 4. Procesa el segundo paso (Validación Administrativa)
public function procesarAdmin() {
$email_ingresado = trim($_POST['email'] ?? '');
$password_ingresado = $_POST['password'] ?? '';
$usuario = $_SESSION['pending_empleado'] ?? null;
if (!$usuario) {
$_SESSION['flash_error'] = "Sesión expirada. Por favor, inicia sesión nuevamente.";
header("Location: index.php?r=auth/login");
exit;
}
$error = null;
// Validación de Email
if ($email_ingresado !== $usuario['email']) {
$error = "El correo electrónico no es correcto.";
}
// ✅ CORRECCIÓN: Usar password_verify() para comparar con el hash
elseif (!password_verify($password_ingresado, $usuario['password_hash'])) {
$error = "La contraseña es incorrecta.";
}
if ($error) {
$_SESSION['flash_error'] = $error;
header("Location: index.php?r=auth/login-admin");
exit;
}
// ÉXITO: Limpiar datos temporales e iniciar sesión real
unset($_SESSION['pending_cedula']);
unset($_SESSION['pending_empleado']);
$this->crearSesion($usuario);
header("Location: index.php?r=dashboard");
exit;
}
// 5. Helper para crear la sesión oficial
private function crearSesion($usuario) {
$_SESSION['user_id'] = $usuario['id'];
$_SESSION['user_name'] = $usuario['name'];
$_SESSION['user_role'] = $usuario['role'];
}
// 6. Cerrar Sesión
public function salir() {
$_SESSION = array();
if (ini_get("session.use_cookies")) {
$params = session_get_cookie_params();
setcookie(session_name(), '', time() - 42000,
$params["path"], $params["domain"],
$params["secure"], $params["httponly"]
);
}
session_destroy();
header("Location: index.php?r=auth/login");
exit;
}
}