Hemos completado la configuración de un sistema de registro de usuarios que permite que los nuevos usuarios se registren e inicien sesión, así como que los usuarios existentes inicien y cierren sesión. Esto significa que ahora tenemos dos tipos de usuarios de nuestro sitio. Un usuario es un invitado o un usuario registrado. Entonces tiene sentido que los usuarios invitados tengan acceso a ciertas áreas del sitio y estén limitados a otras secciones del sitio. Lo mismo ocurre con un usuario registrado. Él o ella deben tener acceso a algunas áreas del sitio, pero no a otras. Este es el escenario perfecto para implementar Middleware en Laravel, y eso es exactamente lo que configuraremos en este tutorial.


Los invitados no deberían poder enviar juegos

Ahora tenemos un sistema de registro de usuarios en nuestra aplicación de juegos. Tiene sentido entonces, que ahora solo debamos permitir que los usuarios registrados puedan enviar nuevos juegos al sitio. De hecho, dado que configuramos la asociación entre Usuarios en el sistema para Juegos y Reseñas específicos, nuestra lógica de store () espera que proporcionemos un user_id cuando intentemos enviar un juego. Si no se proporciona, el intento de insertar un nuevo juego provocará que se genere una excepción como “SQLSTATE [23000]: violación de restricción de integridad: 1048 La columna 'user_id' no puede ser nula”. Como podemos ver, los huéspedes pueden visitar el/games/createruta con facilidad tal como está ahora. Incluso si no proporcionamos un enlace a esa ruta, no hay nada que impida que un usuario simplemente lo escriba en su navegador web. Observe que incluso vemos el enlace Iniciar sesión, que indica nuestro estado de invitado.
los invitados no deberían poder ver el formulario de envío

No proporcionamos un enlace a /games/createpara los invitados, pero pueden simplemente escribirlo en el navegador, como vemos arriba. Podemos usar middleware para evitar que puedan hacer esto. Como queremos proteger algo que tiene que ver con un recurso de Juegos, abrimos el GamesController y aplicamos nuestro middleware así:


aplicación / Http / Controllers / GamesController.php


Ruta [inicio de sesión] no definida.

Si ahora intentamos visitar la /games/createruta como usuario invitado, vemos un problema.
el inicio de sesión de ruta no está definido


Cómo nombrar una ruta

Le alegrará saber que es fácil corregir los errores de Ruta no definida. Resulta que el middleware de autenticación redirige a los usuarios no autenticados a una ruta con nombre . Hasta ahora, no tenemos rutas con nombre en nuestra aplicación. Veamos lo fácil que es definir nuestra ruta de inicio de sesión como la ruta nombrada, iniciar sesión .


rutas / web.php

Una vez que nuestra ruta se nombra como 'inicio de sesión', si luego intentamos visitar 'juegos / crear' como invitados escribiéndolo en el navegador, ahora seremos redirigidos exitosamente a nuestra página de inicio de sesión.
usuarios no autenticados redirigidos a la página de inicio de sesión


Configuración de middleware en el constructor

Ahora hay un middleware de autenticación en nuestro controlador de juegos mediante la configuración en una función de constructor. Lo que esto significa es que cada método en este controlador ahora está protegido por el middleware de autenticación. Esto significa que los usuarios invitados ni siquiera pueden visitar /gamespara enumerar todos los juegos o incluso visitar un juego específico, como visitar /games/3Serán redirigidos directamente a la página de inicio de sesión si intentan hacer algo como esto. Sin embargo, ¿realmente queremos ese comportamiento? Tal vez lo haga para su aplicación, y si esto es lo que desea, todo lo que necesita hacer es agregar $ this-> middleware ('auth'); línea a la función del constructor, y sus recursos se bloquearán con más fuerza que una cadena de banjo.


Limitar los métodos afectados por Middleware

En nuestro caso, realmente no queremos bloquear todos los métodos en nuestro controlador de juegos. Preferiríamos permitir que los usuarios invitados aún puedan hacer uso del sitio web de alguna manera. Dejemos que los usuarios al menos visiten la página de juegos y vean juegos específicos. Para limitar qué métodos se les aplicará el middleware, podemos usar el método except () así:


aplicación / Http / Controllers / GamesController.php

Esto debería permitirnos ver juegos y mirar un juego específico, pero si intentamos escribir en la ruta para enviar un nuevo juego como invitados, seremos redirigidos directamente a la página de inicio de sesión. Veamos esto en acción aquí mismo.
los invitados pueden ver juegos


Los invitados no deberían poder agregar reseñas de juegos

Veamos si se nos presenta el mismo problema si intentamos agregar una reseña del juego como invitado. ¿Recibiremos también ese espeluznante mensaje de error de “SQLSTATE [23000]: Violación de restricción de integridad: 1048 La columna 'user_id' no puede ser nula”? Apuesto a que lo haremos.
SQLSTATE23000 Violación de la restricción de integridad 1048 La columna user_id no puede ser nula

¿Podemos arreglar esto? ¡Por supuesto que podemos! Todo lo que tenemos que hacer es agregar el mismo tipo de middleware de autenticación al Controlador de revisiones como hicimos con el Controlador de juegos. También usaremos ese método except () y pasaremos una matriz de dos cadenas, indexshow, para indicar que queremos proteger todos los métodos de los usuarios invitados, excepto los métodos index () y show (). Podemos permitir que los usuarios invitados vean la lista de reseñas o vean una reseña específica, no hay problema.


aplicación / Http / Controllers / ReviewsController.php

Con nuestra actualización del Controlador de revisiones y la adición de middleware en la función de constructor, como invitados ahora deberíamos poder enumerar todas las revisiones y también mirar una vista específica, pero si intentamos visitar la ruta para agregar una revisión - nuestro nuevo middleware debería decir "oh no, dirígete a la página de inicio de sesión antes de intentar agregar una reseña". Veamos.
auth middleware en acción


Los usuarios autenticados no deberían ver un formulario de inicio de sesión

Como vimos, proteger las rutas de los usuarios invitados fue bastante fácil. ¿Qué pasa con los usuarios registrados? ¿Hay alguna ruta que quizás un usuario registrado no debería visitar realmente? ¿Qué tal la /registerruta? Si un usuario ya ha iniciado sesión en el sistema, no debería poder escribir la /registerruta en su navegador y ver un formulario de registro. Lo mismo ocurre con la /loginruta. Un usuario que haya iniciado sesión no debería poder visitar la /loginruta y ver un formulario de inicio de sesión. Tal como está ahora, eso es exactamente lo que pueden hacer. Iniciaremos sesión como Mario y veremos si este es el caso.
el usuario registrado todavía ve el formulario de inicio de sesión

Mientras que para nuestros controladores de juegos y reseñas utilizamos el middleware $ this-> middleware ('auth'), cuando se trata de rutas de inicio de sesión y registro, usaremos el middleware $ this-> middleware ('invitado') . Básicamente, la versión de autenticación indica que un usuario solo puede acceder a este recurso si está autenticado. Todo lo contrario es el caso del middleware invitado . Establece que un usuario solo puede acceder a recursos particulares si es un invitado. ¡Suena genial! Sigamos adelante y apliquemos ese middleware invitado a nuestro controlador de sesiones para que si un usuario que inició sesión intenta visitar el formulario de inicio de sesión, sea redirigido.

Una vez más, recordemos que si aplicamos un middleware a un controlador en el constructor, afectará a todos los métodos en ese controlador . La mayoría de las veces querrá utilizar el método except () o el método only () para limitar qué métodos de controlador deberían verse afectados por el middleware. En este caso aquí, sabemos que un invitado debe poder ver un formulario de inicio de sesión y establecer una nueva sesión de inicio de sesión a través de los métodos create () y store (). Sin embargo, no tendría sentido que un invitado acceda al método destroy () ya que un invitado no puede cerrar sesión, si no está conectado. Por lo tanto, eliminamos destroy () para que no reciba el tratamiento middlware pasando esa cadena a la excepción () método. Ok, con esto en su lugar, veamos qué sucede.

Obtenemos un error de: NotFoundHttpException en la línea 179 de RouteCollection.php:
middleware invitado laravel redireccionamiento a inicio


Cómo cambiar la redirección del middleware invitado

Vemos que tenemos un error relacionado con una ruta no encontrada o algo por el estilo. Cuando estábamos tratando con el ejemplo de autenticación de middleware, lo corregimos configurando una ruta con nombre. En este caso de utilizar el middleware invitado, podemos adoptar un enfoque diferente. El middleware invitado convierte al usuario en la clase RedirectIfAuthenticated. Esa clase está configurada para redirigir al usuario a /hometravés de la redirección de retorno ('/ home'); Podemos considerar el /gamesrecorrido más de nuestro hogar en esta aplicación. Entonces, todo lo que tenemos que hacer es actualizar esa clase RedirectIfAuthenticated como vemos a continuación, y todo debería funcionar.


aplicación / Http / Middleware / RedirectIfAuthenticated.php

Con ese pequeño cambio, si intentamos escribir la URL de nuestro formulario de inicio de sesión en /logincomo usuario autenticado, se nos redirige directamente a la /gamespágina. Este es el comportamiento exacto que estábamos buscando.
redireccionamiento personalizado de middleware invitado


Los usuarios autenticados no deberían ver un formulario de registro

Lo último que debemos cubrir es la aplicación de middleware a nuestro RegistrationController. RegistrationController hace dos cosas. Ofrece un formulario para crear un nuevo usuario mediante el método create () y almacena ese nuevo usuario en la base de datos mediante el método store (). ¿Debe un usuario que haya iniciado sesión poder visitar el formulario de registro e intentar iniciar sesión como un nuevo usuario? Por supuesto que no, eso realmente no tiene sentido. Sin embargo, podemos solucionarlo aplicando el middleware invitado . Primero, confirmemos que todavía no está funcionando como nos gustaría.
el usuario registrado todavía puede ver el formulario de registro

Parece que ese es el caso. Ahora podemos agregar nuestro middleware invitado al RegistrationController para solucionar este problema.


aplicación / Http / Controllers / RegistrationController.php

Si simplemente actualizamos esa /registerruta, deberíamos ser redirigidos de regreso a nuestra /gamespágina.
Redirigir para formulario de registro de usuario registrado


Cómo proteger rutas específicas con Middleware Resumen

Eso debería cubrir el uso de middleware en Laravel para proteger ciertas rutas de su aplicación en función de su estado de autenticación. Un invitado ya no puede intentar enviar un nuevo juego o reseña, y luego hacer que la aplicación arroje un error porque no hay user_id. Además, nos encargamos de que los usuarios que hayan iniciado sesión sean redirigidos si accidentalmente o intencionalmente intentan escribir las rutas /login/registerPodemos aplicar middleware a los métodos en nuestros controladores configurándolo en la función constructora. También vimos cómo podemos limitar los métodos a los que se aplica el middleware con los métodos except () o only () según sea necesario. ¡Buen trabajo!