Cómo suplantar usuarios en Laravel siendo Administrador (Personificar)

Tienes un proyecto Laravel, y una cuenta de administrador.

Tienes múltiples roles (tipos de usuario) en tu aplicación.

¿Te ha pasado alguna vez que quieres iniciar sesión como uno de tus usuarios?

  • Para ver qué es lo que el usuario está viendo.
  • Para verificiar qué accesos tiene el usuario.
  • Para realizar alguna acción a nombre del usuario.
  • En general, para probar alguna funcionalidad desde su punto de vista.

Esto es algo muy fácil de implementar.

En este artículo vamos a ver cómo, en 3 sencillos pasos.

Paso 1: Definir nuevas rutas

La idea es definir 2 rutas nuevas.

Para iniciar y finalizar el proceso de "suplantación", respectivamente.

Puedes llamar a las rutas como tú prefieras.

Una alternativa es así:

Route::get('/users/{user}/impersonate/start', [ImpersonateController::class, 'start']);
Route::get('/users/impersonate/stop', [ImpersonateController::class, 'stop']);

Como ves, tenemos 2 rutas, ambas resueltas por el mismo controlador 👀.

Paso 2: Crear nuevo controlador

Puedes crear un controlador rápidamente con el siguiente comando Artisan:

php artisan make:controller Admin\ImpersonateController

Lo importante es contar con un método start y un método stop:

class ImpersonateController extends Controller
{
    public function start(User $user): RedirectResponse
    {
        session()->put('impersonated_by', auth()->id());
        
        Auth::login($user);

        return redirect('/');
    }

    public function stop(): RedirectResponse
    {
        Auth::loginUsingId(session()->pull('impersonated_by'));
        
        return redirect('/admin');
    }
}

De tal manera que puedas:

  • Personificar a un usuario determinado.
  • Volver a tu sesión como administrador.

Paso 3: Verificar el funcionamiento

Para verificar el funcionamiento simplemente debes visitar la página correspondiente a tus rutas.

Por ejemplo:

  • Visita /users/7/impersonate/start para iniciar sesión como el usuario con id 7.
  • Visita /users/7/impersonate/stop para dejar de suplantar y volver a tu sesión como administrador.

Seguridad sobre tus rutas

Si bien la característica ya se encuentra implementada, con lo descrito anteriormente, y funciona, hay detalles que debes tener en cuenta.

Por ejemplo, ¿quiénes pueden personificar usuarios?

Lo usual es que sólo los administradores tengan acceso.

Para ello puedes definir un grupo de rutas, y asignar un middleware para asegurar que sólo usuarios admin tengan acceso.

Route::group([
    'middleware' => ['auth', 'admin'],
    'prefix' => 'admin'
], function () {
  // Aquí tu ruta que inicia la suplantación
});

// Aquí tu ruta que detiene (ya que puedes suplantar un usuario que no necesariamente es admin)

Además de eso, para aumentar la seguridad, puedes definir tus rutas usando el verbo POST, en vez de GET.

Eso hará que tus enlaces no sean accesibles directamente, ya que van a requerir de un CSRF token.

Interfaz de usuario

Aunque funciona, visitar tus rutas manualmente, no es muy cómodo.

Como cereza del pastel, puedes agregar unos botones, para facilitar la navegación.

¿Qué debes agregar a tu vista?

Eso dependerá mucho de tu proyecto.

Una opción es agregar un formulario POST, con un CSRF token y un button type submit.

En el siguiente video puedes ver la implementación completa:

# laravel # sesiones # testing

Logo de Programación y más

Comparte este post si te fue de ayuda 🙂.

Regístrate

Accede a todos los cursos, y resuelve todas tus dudas.

Cursos Recomendados

Imagen para el curso Aprende Laravel

Aprende Laravel

Aprende Laravel desde cero y desarrolla aplicaciones web reales, en tiempo récord, de la mano de Laravel.

Iniciar curso
Imagen para el curso Laravel Upgrade

Laravel Upgrade

Actualiza tus proyectos desde cualquier versión hasta la última versión estable de Laravel.

Iniciar curso
Imagen para el curso Laravel y Vue

Laravel y Vue

Desarrollemos un Messenger! Aprende sobre Channels, Queues, Vuex, JWT, Sesiones, BootstrapVue y mucho más.

Iniciar curso

Espera un momento ...

¿Te gustaría llevar mi curso de Laravel, gratis?

Sólo debes ingresar tus datos: