lab404/laravel-impersonate
Add secure user impersonation to Laravel: let admins log in as other users for support and debugging, then easily leave impersonation. Includes middleware, routes/helpers, session-based tracking, and simple integration with your User model.
ImpersonateStarted, ImpersonateEnded) allows for extensibility via listeners (e.g., logging, notifications).users table with id/email fields (configurable via getAuthIdentifier()).illuminate/support and illuminate/auth).null sessions during impersonation).VerifyCsrfToken, ThrottleRequests).| Risk Area | Severity | Mitigation |
|---|---|---|
| Session Hijacking | High | Enforce MFA/TOTP for impersonating users; log events via ImpersonateStarted. |
| Middleware Override | Medium | Test with existing middleware (e.g., VerifyCsrfToken may need exclusion). |
| Nested Impersonation | Medium | Implement depth tracking (e.g., session variable) to prevent infinite loops. |
| Performance Overhead | Low | Benchmark in staging; minimal impact (~50ms for impersonation flow). |
| Deprecation Risk | Low | Actively maintained; monitor Laravel version support (e.g., Laravel 14.x). |
| Multi-Guard Complexity | Low | Use guard() method or configure default guard in config/impersonate.php. |
Log facade or third-party tools like Datadog)?Auth::user() returns null during impersonation?tenant()), how will impersonation respect tenant contexts?Discovery Phase:
Installation:
composer require lab404/laravel-impersonate
php artisan vendor:publish --provider="Lab404\Impersonate\ImpersonateServiceProvider"
// config/impersonate.php
'roles' => ['admin', 'support'], // Allowed roles
'timeout' => 900, // 15 minutes
'guard' => 'web', // Default guard
Core Integration:
Route::middleware(['auth', 'can:impersonate-users'])->group(function () {
Route::post('/impersonate/{user}', [ImpersonateController::class, 'impersonate']);
});
use Lab404\Impersonate\Facades\Impersonate;
public function impersonate(User $user) {
Impersonate::impersonate($user, request()->input('redirect_to', '/dashboard'));
return redirect()->back()->with('status', 'Impersonating user...');
}
@impersonating
<p>You are impersonating {{ Auth::user()->name }}.</p>
@endimpersonating
Advanced Configuration:
findUserById for non-Eloquent users:
Impersonate::setUserProvider(function ($id) {
return User::where('api_token', $id)->first();
});
Event::listen(ImpersonateStarted::class, function ($event) {
Log::info('User impersonated', ['impersonator' => $event->impersonator, 'target' => $event->user]);
});
Testing:
ImpersonateManager methods (e.g., impersonate(), leave()).How can I help you explore Laravel packages today?