Link Search Menu Expand Document

5.13. Sesiones con Laravel

Como es lógico, Laravel también proporciona su propio sistema de manejo de variables de sesión, es decir, variables persistentes en el servidor asociadas a cada cliente.

Las variables de sesión de Laravel son mucho más seguras y poderosas que las variables de sesión estándar de PHP. En esta sección vamos a ver cómo funcionan y qué posibilidades nos ofrecen las sesiones en Laravel.

5.13.1. Drivers de sesión

Las sesiones de configuran en /config/sessions.php, y una de las cosas que debes configurar ahí es el driver de sesión, es decir, el tipo de manejador que quieres que manipule las sesiones.

  • Files:

    El driver por defecto es files. Es el más sencillo y funcionará en casi cualquier servidor. Eso significa que Laravel guardará las variables de sesión en un fichero especial en el servidor (que nosotros no tenemos que manejar: Laravel se encargará de todo).

  • Memcached y redis:

    El driver files es más que suficiente para una aplicación en desarrollo, pero para una aplicación en producción, Laravel recomienda usar otros drivers llamados memcached o redis porque son más rápidos. Ambos son daemons del sistema programados para esta tarea. Obviamente, el servidor debe soportarlos para que puedas usarlos.

    Consulta con tu proveedor o con tu administrador de sistemas la configuración de tu servidor web para saber si puedes usar alguno de estos dos drivers. Si no, tendrás que conformarte con files.

  • Database:

    Si necesitas seguridad adicional, sin duda tu driver es database. Esto almacenará dos copias de cada variable de sesión: una en un fichero y otra en una tabla especial de la base de datos.

    Si un atacante consiguiera manipular una de las dos variables, Laravel cerrará la sesión automáticamente y el atacante se quedará con un palmo de narices. Eso sí, este sistema es el más lento de todos porque requiere un acceso a la base de datos para cada petición al servidor.

5.13.2. Persistencia de las variables de sesión

Laravel maneja dos tipos de variable según su persistencia:

  • Variables flash: solo duran una petición y luego desaparecen.
  • Variables de sesión convencionales: existen hasta que las destruimos expresamente.

Variables flash

Son variables de sesión que solo duran una petición y luego se autodestruyen. Se usan típicamente para enviar un feedback o mensaje de retroalimentación al usuario.

Te lo muestro con un ejemplo. Imagina el típico formulario de login. En caso de producirse un error, lo habitual es que la aplicación nos muestre de nuevo ese formulario con un mensaje del tipo de “Usuario no reconocido”.

Para lograr eso, haríamos lo siguiente en el controlador. Observa el uso del método with() para crear una variable flash de sesión llamada mensaje:

    return ('login/form')->with('mensaje', 'Usuario no reconocido');

En la vista, podemos acceder a esa variable flash. Por ejemplo, así:

    @if (session('mensaje'))
        {{ session('mensaje'); }}
    @endif

A partir de este momento, la variable flash se destruye y cualquier intento de acceder a ella provocará un error de ejecución.

Variables de sesión convencionales

Las variables de sesión convencionales se manejan con la clase Session, que tiene un montón de métodos estáticos para crear variables, destruirlas, consultarlas, etc.

Los métodos más útiles son:

  • put() -> almacena una variable de sesión:

        Session::put('nombre-variable', 'valor');
    
  • push() -> elimina una variable de sesión:

        Session::push('nombre-variable');
    
  • get() -> devuelve el valor de una variable de sesión:

        $v = Session::get('nombre-variable');
        $v = Session::get('nombre-variable', 'valor-por-defecto');
    
  • all() -> devuelve todas las variables de sesión en un array:

        $a = Session::all('nombre-variable', 'valor');
    
  • flush() -> elimina todas las variables de sesión:

        Session::flush();
    
  • flash() -> crea manualmente una variable de sesión de tipo flash:

        Session::flash('nombre-variable', 'valor');
    

5.13.3. Autenticación

La autenticación de usuarios, es decir, el sistema de login seguido de la creación de una o varias variables de sesión asociadas al usuario que se acaba de loguear, es un componente habitual de muchas aplicaciones web.

Hasta la versión 5, Laravel proporcionaba un sistema de autenticación integrado en su código que se podía añadir a nuestra aplicación con un simple comando de Artisan. Pero a partir de Laravel 6, los desarrolladores decidieron aligerar el núcleo de Laravel lo máximo posible, y sacaron del sistema muchos componentes, incluyendo el sistema de autencicación.

Actualmente, Laravel proporciona los denominados Starter Kits, que son componentes que se pueden instalar mediante composer para realizar esas tareas que se extrajeron del núcleo de Laravel.

Para la autenticación, Laravel dispone de dos Starter Kits, llamados Breeze y Jetstream. Vamos a ver el primero, que es más sencillo pero suficiente en la mayor parte de las situaciones.

5.13.4. Laravel Breeze

Larevel Breeze contiene todo el código necesario para crear un sistema de autenticación completo y seguro capaz, entre otras cosas, de:

  • Hacer el Login e iniciar la sesión
  • Registrar nuevos usuarios
  • Recuperar contraseñas olvidadas
  • Confirmaar el registro de usuarios mediante email

Para instalar Laravel Breeze, debes abrir un terminal en tu servidor web y ejecutar estos comandos:

$ composer require laravel/breeze --dev
$ php artisan breeze:install
$ npm install
$ npm run dev
$ php artisan migrate

El primer comando instalará las librerías PHP necesarias para que Laravel Breeze se ejecute. El segundo, añadirá Breeze a tu aplicación, creando automáticamente varios controladores, modelos, vistas y hasta migraciones. Los dos comandos npm sirven para compilar el CSS y el JS de Breeze, de manera que funcione más rápido. Por último, actualizamos las migraciones para que se creen las tablas adicionales que Breeze va a necesitar.

Una vez hecho esto, Breeze creará automáticamente varias rutas en un enrutador especial, /routes/auth.php. Entre ellas:

Routes::get("/login")  Para mostrar el formulario de login
Routes::post("/login")  Para procesar el formulario de login
Routes::post("/logout")  Para cerrar la sesión
Routes::get("/register")  Para mostrar el fomulario de registro
Routes::post("/register")  Para procesar el formulario de registro

Puedes probarlas escribiéndolas en tu navegador. Comprobarás que funcionan estupendamente.

También se crearán varios controladores como LoginController y RegisterContoller. Los puedes encontrar en App/Http/Controllers/Auth.

Y, por supuesto, se crean varias vistas, como auth/login.blade.php, register.blade.php y layouts/app.blade.php (la plantilla que usarán login y register).

Por último, se crea una vista home de ejemplo (dashboard.blade.php) a la que llegamos después de hacer login. Esa vista home la puedes cambiar en /app/providers/RouteServiceProvider.php para redirigirla a la vista que te interese.

¡Y listo! Ya tienes hecho un sistema de login completo y superseguro. Solo te queda adaptar esas vistas y controladores a tus necesidades.

5.13.5. Autenticación y vistas: cómo generar código dependiendo del tipo de usuario

En las vistas, tenemos un par de directivas de Blade muy útiles relacionadas con las sesiones: @auth y @guest. Puedes ver cómo funcionan en este ejemplo:

   @auth
   ...   // Este código solo se ejecuta si existe un usuario logueado
   @endauth
   @guest
   ...   // Este código solo se ejecuta si NO existe usuario logueado
   @endguest

Además, podemos acceder a los datos del usuario mediante la clase Auth:

$user = Auth::user() // Devuelve el usuario actualmente logueado o null si no hay ninguna sesión abierta.
if (Auth::check()) { // Devuelve true si el usuario actual está logueado.
   ...
}

(Más métodos de Auth en la documentación oficial)

5.13.6. Autenticación y middlewares: cómo proteger los controladores

Los middlewares de Laravel son componentes que capturan y filtran todas las peticiones HTTP que llegan a la aplicación. Literalmente, se ponen en medio de cualquier petición al servidor, y de ahí su nombre. Están ubicados en App/Http/Middleware.

Hay dos middlewares importantes relacionados con la autenticación en Laravel: Authenticate (que tiene un alias: auth) y RedirectIfAuthenticated (alias guest). Los alias se definen en App/Http/Kernel.php

Podemos usar estos middlewares en el constructor de nuestros controladores para protegerlos en todo o en parte. Es decir, para impedir el acceso de usuarios no logueados a ciertos métodos del controlador.

Observa este ejemplo para aprender a hacerlo. Ya verás qué fácil y versátil es:

   public function __construct() {
      // Solo usuarios logueados podrán acceder a cualquier función de este controlador:
      $this->middleware("auth"); 
      // Solo usuarios logueados podrán acceder a los métodos create() y edit():
      $this->middleware("auth")->only("create", "edit");
      // Solo usuarios logueados podrán acceder al controlador excepto a show():
      $this->middleware("auth")->except("show");
   }

El middleware auth también puede usarse en el enrutador, para proteger el acceso a una ruta concreta, así:

   Route::get('/ruta-a-proteger', 'Controlador@metodo')->middleware('auth');