Laravel Impersonate: loguearse como cualquier usuario

Cuando estamos desarrollando, hay veces que tenemos que estar iniciando y cerrando sesión para cambiar de usuario porque estamos desarrollando algo que, por ejemplo, ciertos usuarios lo tienen restringido y tenemos que comprobarlo. Está claro que en esos cambios de usuario, se pierde bastante tiempo y es bastante engorroso. También, hay veces en producción, que hay bugs que a nuestro usuario no le pasa, pero a otro usuario sí, pero no nos podemos loguear como ese usuario porque no tenemos su contraseña.

Para resolver estos casos y otros similares, existe un paquete en Laravel llamado Laravel Impersonate que permite exactamente eso, loguarte como cualquier usuario de tu app sin necesidad de saber la contraseña. En esta entrada, vamos a crear un ejemplo sencillo para ver el funcionamiento del paquete.

Antes de nada, yo voy a partir de un instalación de Laravel 5.7 sin nada. Lo único que le he añadido ha sido un campo “type” a la migración de la tabla “users” para después controlar qué tipo de usuario (admin=1 y user=2) puede loguearse como otro usuario y cuales no pueden.

Vamos a comenzar instalando el paquete:

Cuando finalice, si la versión es inferior a la 5.5 tendrás que añadir el provider a config/app.php. Yo como tengo la 5.7, no lo tengo que añadir gracias al auto-discorvery.

Una vez tengamos esto, tenemos que añadir el trait Impersonate al modelo de usuario, en mi caso, app/User.php:

Cuando tengamos esto ya está instalado ya podremos empezar a utilizarlo!

Para integrar el funcionamiento en sí hay dos maneras:

1. Podríamos crear un controlador con 2 métodos y utilizar los métodos que nos proveé el paquete.

2. Podríamos utilizar el macro de Route llamado impersonate que nos proveé el paquete que te crea ya las rutas y utiliza un controlador que ya viene integrado en el paquete.

En este tutorial, voy a utilizar la segunda opción ya que es más sencilla y el controlador ya viene con los controles específicos para gestionar, con dos métodos que tendremos que añadir al modelo User, quién puede suplantar (canImpersonate) y quién puede ser suplantado (canBeImpersonated).

Aclarado esto, vamos a crear una lista de los usuarios que tenemos en nuestra base de datos. Para ello, vamos a crear un controlador llamado UserController.php:

Creamos la vista para el controlador en users/index.blade.php:

Y añadimos tanto la ruta para el listado de usuarios como las del paquete (comentada anteriormente) bajo los middlewares web y auth, para que solo la puedan entrar los usuarios logueados:

Entramos a http://localhost:8000 nos logueamos como cualquier usuario de nuestra base de datos, si no tenemos niguno creamos un par y deberíamos ver algo como esto:

Si te fijas, yo estoy logueado con el usuario Admin y no sale el botón de “Loguearse como…”. Eso es debido a que en la vista, se ha restringido a que solamente salga en los usuarios que sean diferentes al usuario que está logueado.

Falta una última cosa y es añadir una enlace para volver al usuario original cuando se esté logueado como cualquier otro usuario. Para ello, añadimos el siguiente código (yo lo he añadido en layouts/app.blade.php en el header):

Con todo esto obtendremos lo siguiente:

Por último, lo que vamos a hacer va a ser restringir los usuarios que pueden suplantar y los que pueden ser suplantados. Para ello, vamos a añadir dos métodos al modelo User y lo que vamos a hacer va a ser que solamente los usuarios tipo admin (type=1) puedan suplantar y que solamente puedan ser suplantados los usuarios tipo usuarios normales (type=2). Añadimos los métodos:

Y añadimos el siguiente código para que a los usuarios tipo usuario (type=2) no les salga el botón de “Loguearse como…”:

El resultado sería este:

Pero aún no hemos comprobado que solamente los usuarios tipo admin (type=1) pueden loguearse como otro usuario, vamos a comprobarlo. Estoy logueado como un usuario tipo usuario normal (type=2) y aunque no sale el botón para loguearse como otro usuario por el código añadido anteriormente, si forzamos entrando por la url (http://localhost:8000/impersonate/take/1), nos lanza un error 403. Por tanto, se está restringiendo el acceso correctamente. El código para esto puedes verlo en el controlador del paquete.


Aloja tu proyecto en DigitalOcean: Obtén $200 de crédito gratis al registrarte a través de este enlace.

Si hay cualquier tipo de error en el post o te surge cualquier duda, no dudes en ponerlo en los comentarios o enviarme un correo desde la página de contacto.

? CONTACTAR

3 comentarios en “Laravel Impersonate: loguearse como cualquier usuario

Deja una respuesta

  Acepto la política de privacidad