Como suplantar a usuarios en tu aplicación Laravel

  • Publicado el 05 agosto, 2024
  • Palabras: 488

Una de las características interesantes de Laravel es la capacidad de hacerse pasar por usuarios directamente desde el panel de control. Esto es útil por muchas razones, pero para mí, cuando recibes un informe de error o un problema y quieres ver exactamente lo que ve el usuario, hacerse pasar por él ahorra mucho tiempo porque puedes ver exactamente lo que él ve.

Como suplantar a usuarios en tu aplicación Laravel

Si deseas configurar esta opción en tu aplicación Laravel, el paquete Laravel Impersonate lo hace sencillo. Aquí se explica cómo comenzar.

 

#Paso 1. Instalar y configurar el paquete

 

Al igual que todos los paquetes, instálalo con composer:

 

composer require lab404/laravel-impersonate

 

A continuación, abre config/app.php y agréguelo al array de providers:

 

'providers' => [
    // ...
    Lab404ImpersonateImpersonateServiceProvider::class,
],

 

Después de eso, abre el modelo Models/User y añade el trait:

 

use Lab404ImpersonateModelsImpersonate;
 
class User extends Authenticatable
{
    use Impersonate;

 

#Paso 2. Impersonate Routes

 

El paquete Laravel Impersonate incluye algunas formas de hacerse pasar por un usuario, pero me resultó más fácil usar su macro de rutas agregándola a su archivo route/web.php.

 

Route::impersonate();

 

Esto te proporciona algunas rutas con nombre:

 

// Where $id is the ID of the user you want to impersonate
route('impersonate', $id)
 
// Or in case of multi guards, you should also add 'guardName' (defaults to 'web')
route('impersonate', ['id' => $id, 'guardName' => 'admin'])
 
// Generate an URL to leave the current impersonation
route('impersonate.leave')

 

#Step 3. Uso de impersonate en Laravel Blade

 

Ahora que Laravel Impersonate está completamente configurado, puedes usar algunos ayudantes de Blade:

 

@canImpersonate($guard = null)
    <a href="{{ route('impersonate', $user->id) }}">Impersonate this user</a>
@endCanImpersonate

 

Luego, lo inverso:

 

@impersonating($guard = null)
    <a href="{{ route('impersonate.leave') }}">Leave impersonation</a>
@endImpersonating

 

#Paso 4. Configuración avanzada

 

Otra cosa que podrías considerar configurar son las opciones para limitar quién puede hacerse pasar por otros usuarios y qué usuarios pueden ser suplantados. En tu modelo Models/User, puedes agregar los siguientes métodos:

 

/**
 * De forma predeterminada, todos los usuarios pueden 
 * hacerse pasar por cualquier persona, este ejemplo lo limita 
 * para que solo los administradores puedan hacerse pasar por otros usuarios.
 */
public function canImpersonate(): bool
{
    return $this->is_admin();
}
 
/**
 * De forma predeterminada, todos los usuarios 
 * pueden ser suplantados, esto lo limita solo a ciertos usuarios.
 */
public function canBeImpersonated(): bool
{
    return ! $this->is_admin();
}

 

#Uso de Impersonate con Laravel Jetstream

 

Mientras usaba este paquete en producción con Laravel Jetstream, tuve un problema en el que funcionaba esporádicamente. Si tiene problemas aquí, intente agregar esta recomendación a su EventServiceProvider:

 

public function boot()
{
    Event::listen(function (TakeImpersonation $event) {
        session()->put([
            'password_hash_sanctum' => $event->impersonated->getAuthPassword(),
        ]);
    });
 
    Event::listen(function (LeaveImpersonation $event) {
        session()->remove('password_hash_web');
        session()->put([
            'password_hash_sanctum' => $event->impersonator->getAuthPassword(),
        ]);
        Auth::setUser($event->impersonator);
    });
}

 

#Finalizando

 

En general, el paquete Laravel Impersonate incluye todo lo que necesitas para iniciar sesión fácilmente como otros usuarios y es una forma sencilla de agregar esto a tu aplicación. Si deseas obtener más información sobre el paquete y las funciones más avanzadas, consulta el paquete. El archivo Léame incluye más detalles.

Antonio Jenaro

Antonio Jenaro

Web Developer

Archivado en:

Fuente: Laravel news

Inicia la conversación

Hazte miembro de Antonio Jenaro para comenzar a comentar.

Regístrate ahora

¿Ya estás registrado? Inicia sesión