Middleware es responsable de filtrar las solicitudes HTTP que llegan a la aplicación, así como las que se van (mucho menos utilizadas). El caso más clásico es el de verificar la autenticación de un usuario para que pueda acceder a ciertos recursos. También puede usar un middleware, por ejemplo, para iniciar la administración de la sesión.
Aquí hay un diagrama para ilustrar esto:
En realidad, podemos tener varios middlewares en cáscaras de cebolla, cada uno lleva a cabo su tratamiento y transmite la solicitud o la respuesta a la siguiente.
Por lo tanto, tan pronto como haya un tratamiento a realizar a la llegada de las solicitudes (o a su salida), se indica un middleware.
Laravel se puede utilizar como una aplicación "web" o "api". En el primer caso necesitamos:
administrar cookies,
para gestionar una sesión,
para administrar la protección CSRF
Archivo Kernel.php, donde se registran los middelware
Para ver los middleware configurados en nuestro sistema tenemos que entrar en el archivo app/Http/Kernel.php.
El Kernel es el que le dice a Laravel qué middlewares tiene que cargar. Allí encontrarás una clase que tiene registrados los middleware que se van a ejecutar en el sistema, tanto de manera global (propiedad $middleware) como para rutas particulares (propiedad $routeMiddleware).
Hay dos middlewares de grupos (se juntan varios middlewares) "web" y "api". Vemos que en el primer caso activamos cookies, sesiones y verificación CSRF.
Por defecto, todas las rutas que ingresa en el archivo routes / web.php están incluidas en el grupo "web". Si busca en el proveedor / Providers / RouteServiceProvider.php encontrará esta inclusión:
Los middleware son filtros que se ejecutan antes de que el control pase a una ruta o a un controlador.
Podemos asociar un middleware a una ruta:
O a un controlador, en su constructor:
kernel.php
En el kernel.php de la aplicación se definen varias cuestiones relativas a los middleware.
Un grupo de middleware que se aplican a todas las peticiones. Atributo $middleware.
Se asignan nombres a los middleware para ser usados en las rutas. Atributo $routeMiddleware.
Dos grupos de middleware:
web que se aplica a todas las rutas definidas en el fichero de rutas web.php
api que se aplica a las rutas del fichero api.php
Ejemplos de middleware
CheckForMaintenanceMode Se aplica a todas las rutas. Se activa su funcionalidad con los comandos:
php artisan down
php artisan up
Después de down genera un error 503
Comprueba la existencia del fichero /storage/framework/down
Down crea el fichero, up lo borra.
Vamos a ver los que se aplican a todas las peticiones web.
EncryptCookies. Encripta las cookies
AddQueuedCookiesToResponse. Añade las cookies creadas mediante el método Cookie::queue($micookie);
StartSession. Inicia sesión de forma automática.
ShareErrorsFromSession Hace visible el objeto errors tras la validación.
VerifyCsrfToken. Verifica los token CSRF.
SubstituteBindings ¿?
Además, dispondremos de los siguientes definidos en route:
auth. Pasa el filtro si estás autenticado.
guest. Pasa el filtro si no has hecho login
can. Filtro usado para autorización.
throttle. Limita el número de peticiones por minuto aceptadas desde un host determinado.
Construir un middleware:
Usamos artisan:
Código.
La lógica está en la función handle.
Si se dan las condiciones adecuadas se pasa el filtro (return $next($request);)
Si no se dan las condiciones abortar o redirigir.
Registrar el middleware en el kernel dentro de $routeMiddleware
Hemos visto que el formulario generado por Laravel tiene una línea especial:
Si miramos el código generado, encontramos algo como esto:
El midedleware VerifyCsrfToken, el cual es incluido en el grupo de middleware web, verificará automáticamente que el token en el campo de la solicitud coincida con el almacenado en la sesión.
Para que sirve
En primer lugar, CSRF significa Cross-Site Request Forgery.( falsificación de solicitudes entre sitios) . Es un ataque que implica enviar una solicitud a un cliente sin su conocimiento. Este ataque es relativamente sencillo de configurar y consiste en enviar a un cliente autenticado en un sitio un script oculto (en una página web o un correo electrónico) para que realice una acción sin su conocimiento.
Para protegerse contra este tipo de ataque, Laravel genera un valor aleatorio ( token ) asociado con el formulario, de modo que en el envío este valor se verifica para asegurarse del origen.
¿ Dónde está este middleware CSRF?
Está ordenado en la carpeta app / Http / Middleware :
Para probar la efectividad de esta verificación, intente enviar un formulario sin el token, modificando así la vista:
Te encuentras con esta página al enviar:
Como el token no es bueno, Laravel concluye que ha caducado porque obviamente tiene un período de validez limitado vinculado a la sesión.
Analicemos esta respuesta un poco mejor:
Vemos una respuesta 419 que aún no forma parte del estándar HTTP, pero que se usa cada vez más como una alternativa a 401.
Analicemos esta respuesta un poco mejor:
Vemos una respuesta 419 que aún no forma parte del estándar HTTP, pero se usa cada vez más como una alternativa al 401.
Página de error personalizada
La página de error en la que hemos caído no es muy explícita y está en inglés. Podríamos quererlo en español, o simplemente cambiar el estilo. ¿Pero dónde está el código de esta página? Busque en la carpeta vendor/laravel/frameword:
Encuentra una carpeta de las vistas predeterminadas de Laravel para los errores más comunes. ¡Obviamente no modificará estas vistas directamente en la carpeta vendor! Pero puede anular estas vistas creando una carpeta de resources/views/errors y copiando el archivo afectado:
Entonces tenemos este código:
Adapta el código según tus gustos. Todavía no he hablado sobre las habilidades lingüísticas de Laravel. La sintaxis __ (...) hace posible que el mismo código sirva para varios idiomas. Pero si solo tiene francés, puede cambiar directamente:
.
Puede hacer esto para cualquier código de error.
Sesiones
Los parámetros de configuración de sesiones se definen en config/session.php.
Importante es el almacenamiento y el tiempo de vida de la sesión.
Con Laravel no es preciso usar directamente la variable $_SESSION.
ni debemos usar las funciones session_start() o session_destroy()
Podemos acceder a un dato guardado en sesión de tres modos:
El request, esto requiere inyección de dependencias:
La fachada Session
La función helper session():
Obtener todos los datos de una sesión
Podemos guardar datos en sesión de dos modos:
Podemos eliminar datos de sesión:
Guardar datos sólo durante una petición (request) sólamente.
Esto se usa en validaciones de forma automática, transparente al usuario