Weave Code
Code Weaver
Helps Laravel developers discover, compare, and choose open-source packages. See popularity, security, maintainers, and scores at a glance to make better decisions.
Feedback
Share your thoughts, report bugs, or suggest improvements.
Subject
Message

Impersonate Laravel Package

christhompsontldr/impersonate

Laravel package to let authorized users impersonate other accounts for support and troubleshooting. Provides start/stop impersonation helpers, middleware/guards integration, and easy checks to ensure only permitted roles can switch users safely.

View on GitHub
Deep Wiki
Context7

Getting Started

Minimal Setup

  1. Installation

    composer require christhompsontldr/impersonate
    

    Publish the config file (if needed):

    php artisan vendor:publish --provider="ChrisThompsonTLDR\Impersonate\ImpersonateServiceProvider"
    
  2. Configure Middleware Add the Impersonate middleware to your routes or HTTP kernel:

    // app/Http/Kernel.php
    protected $routeMiddleware = [
        'impersonate' => \ChrisThompsonTLDR\Impersonate\Middleware\Impersonate::class,
    ];
    

    Or in routes/web.php:

    Route::middleware(['auth', 'impersonate'])->group(function () {
        // Impersonation-enabled routes
    });
    
  3. First Use Case Trigger impersonation via a route:

    Route::get('/impersonate/{user}', function ($user) {
        return \ChrisThompsonTLDR\Impersonate\Facades\Impersonate::impersonate($user);
    })->middleware(['auth', 'impersonate']);
    

    Or programmatically:

    use ChrisThompsonTLDR\Impersonate\Facades\Impersonate;
    
    Impersonate::impersonate($targetUser);
    

Implementation Patterns

Core Workflows

  1. Impersonation Flow

    • Trigger: Use a button/link in your admin panel (e.g., "Impersonate User").
    • Validation: Check permissions (e.g., auth()->user()->can('impersonate')).
    • Execution:
      Impersonate::impersonate($user)->redirectTo('/dashboard');
      
    • Exit: Provide a clear "Stop Impersonating" link/button (e.g., /impersonate/stop).
  2. Route Integration

    • Protect impersonation routes with middleware:
      Route::middleware(['auth', 'can:impersonate-others'])->group(function () {
          Route::post('/impersonate/{user}', [ImpersonateController::class, 'impersonate']);
      });
      
    • Use the facade for clean logic:
      public function impersonate(User $user) {
          return Impersonate::impersonate($user)->redirectTo(request()->header('Referer'));
      }
      
  3. Session Management

    • Leverage the package’s session-based approach to avoid hardcoding user IDs.
    • Customize the session key in config/impersonate.php:
      'session_key' => 'impersonate_user_id',
      
  4. View Integration

    • Display impersonation status in layouts:
      @if(auth()->check() && auth()->user()->isImpersonating())
          <div class="impersonating-badge">
              Impersonating: {{ auth()->user()->impersonatedUser->name }}
              <a href="/impersonate/stop">Stop</a>
          </div>
      @endif
      
  5. API Usage

    • For APIs, return impersonation status in responses:
      return response()->json([
          'user' => auth()->user(),
          'is_impersonating' => auth()->user()->isImpersonating(),
      ]);
      

Gotchas and Tips

Pitfalls

  1. Session Expiry

    • Impersonation relies on the session. Ensure session drivers (e.g., file, database) persist across requests.
    • Fix: Configure SESSION_DRIVER=database in .env if using file sessions.
  2. Middleware Order

    • Place Impersonate middleware after auth but before route-specific middleware to avoid conflicts.
    • Example:
      $router->middlewareGroup('admin', [
          \App\Http\Middleware\Authenticate::class,
          \ChrisThompsonTLDR\Impersonate\Middleware\Impersonate::class,
          // Other middleware...
      ]);
      
  3. User Model Assumptions

    • The package assumes your User model has:
      • id as the primary key.
      • A name attribute for display.
    • Fix: Extend the User model or override the facade methods:
      Impersonate::impersonate($user)->setDisplayAttribute('username');
      
  4. CSRF Token Issues

    • Impersonation may break CSRF tokens if not handled. Use Impersonate::impersonate()->withoutRedirect() for AJAX calls.
  5. Permission Bypass

    • Impersonation can bypass role-based access. Mitigation:
      • Log impersonation actions:
        event(new UserImpersonated(auth()->user(), $targetUser));
        
      • Restrict impersonation to specific roles (e.g., admin).

Debugging Tips

  1. Check Session Data

    • Inspect the session key (config('impersonate.session_key')) to verify impersonation state:
      dd(session(config('impersonate.session_key')));
      
  2. Middleware Debugging

    • Temporarily log middleware execution:
      public function handle($request, Closure $next) {
          \Log::info('Impersonate middleware triggered');
          return $next($request);
      }
      
  3. Redirect Loops

    • If impersonation redirects infinitely, check redirectTo() paths or session conflicts.

Extension Points

  1. Custom Redirect Logic

    • Override the facade’s redirectTo() method:
      Impersonate::impersonate($user)->redirectTo(fn () => route('admin.dashboard'));
      
  2. Event Listeners

    • Listen for impersonation events:
      // EventServiceProvider
      protected $listen = [
          \ChrisThompsonTLDR\Impersonate\Events\UserImpersonated::class => [
              \App\Listeners\LogImpersonation::class,
          ],
      ];
      
  3. Database Logging

    • Log impersonation to a user_impersonations table:
      Impersonate::impersonate($user)->logImpersonation();
      
  4. Multi-Tenant Support

    • Extend the package to support tenants by overriding the session key:
      config(['impersonate.session_key' => 'tenant_' . tenant()->id . '_impersonate_user_id']);
      
  5. Impersonation Limits

    • Restrict impersonation depth (e.g., prevent impersonating an already-impersonated user):
      if (auth()->user()->isImpersonating()) {
          abort(403, 'Cannot impersonate while already impersonating.');
      }
      
Weaver

How can I help you explore Laravel packages today?

Conversation history is not saved when not logged in.
Prompt
Add packages to context
No packages found.
davejamesmiller/laravel-breadcrumbs
artisanry/parsedown
christhompsontldr/phpsdk
enqueue/dsn
bunny/bunny
enqueue/test
enqueue/null
enqueue/amqp-tools
milesj/emojibase
bower-asset/punycode
bower-asset/inputmask
bower-asset/jquery
bower-asset/yii2-pjax
laravel/nova
spatie/laravel-mailcoach
spatie/laravel-superseeder
laravel/liferaft
nst/json-test-suite
danielmiessler/sec-lists
jackalope/jackalope-transport