Cómo suplantar usuarios en Laravel siendo Administrador (Personificar)
Tiempo de lectura: 1.67 minutos
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: