hapidjus/laravel-impersonate-ui
Install the Package
composer require hapidjus/laravel-impersonate-ui
Add the Trait to Your User Model
Ensure your App\Models\User (or equivalent) includes:
use Lab404\Impersonate\Models\Impersonate;
use Hapidjus\ImpersonateUI\Traits\ImpersonateUI;
class User extends Authenticatable
{
use Notifiable, Impersonate, ImpersonateUI;
}
Publish Assets Run:
php artisan vendor:publish --tag=config --tag=view
config/impersonate-ui.phpresources/views/vendor/impersonate-ui/Add Middleware
Register the impersonate middleware in app/Http/Kernel.php:
'web' => [
// ...
\Hapidjus\ImpersonateUI\Middleware\ImpersonateUI::class,
],
First Use Case
/admin/dashboard).User Selection
name, email, or custom fields.config/impersonate-ui.php:
'search_fields' => ['name', 'email', 'username'],
Integration with Existing UI
resources/views/layouts/app.blade.php):
@impersonateUI
window.impersonateUI.open();
Role-Based Access Restrict impersonation to specific roles in the config:
'users_allowed' => ['admin@example.com', 'supervisor@example.com'],
Or dynamically via middleware:
public function handle($request, Closure $next)
{
if (!auth()->user()->isAdmin()) {
abort(403);
}
return $next($request);
}
Customizing the UI
resources/views/vendor/impersonate-ui/.php artisan vendor:publish --tag=js
Then update public/vendor/impersonate-ui/js/impersonate-ui.js.Logging and Auditing
Track impersonation events by extending the Impersonate trait:
protected static function bootImpersonate()
{
parent::bootImpersonate();
static::impersonating(function ($user, $impersonator) {
\Log::info("User {$impersonator->email} impersonated as {$user->email}");
});
}
Middleware Placement
ImpersonateUI middleware is registered after auth middleware in Kernel.php:
'web' => [
\App\Http\Middleware\Authenticate::class,
\Hapidjus\ImpersonateUI\Middleware\ImpersonateUI::class,
],
Debug Mode Dependency
APP_DEBUG=false).'enabled' => env('IMPERSONATE_UI_ENABLED', false),
Then set in .env:
IMPERSONATE_UI_ENABLED=true
User Model Mismatch
Impersonate trait.User model (e.g., App\Models\User, not App\User).JavaScript Conflicts
php artisan vendor:publish --tag=js
Permission Denied
403.users_allowed in config or implement custom authorization logic in the middleware.Dynamic User Filtering
Override the getImpersonateUIUsers method in your User model:
public function getImpersonateUIUsers()
{
return self::where('is_active', 1)->get();
}
Localization Translate UI strings by publishing the language files:
php artisan vendor:publish --tag=lang
Then add translations to resources/lang/{locale}/impersonate-ui.php.
Impersonation Depth
Limit nested impersonation by extending the Impersonate trait:
protected static function bootImpersonate()
{
parent::bootImpersonate();
static::impersonating(function ($user, $impersonator) {
if ($impersonator->isImpersonating()) {
abort(403, 'Nested impersonation not allowed.');
}
});
}
Testing
Use the Impersonate facade in tests:
use Lab404\Impersonate\Facades\Impersonate;
public function test_impersonation()
{
Impersonate::impersonate(User::find(1));
$this->assertAuthenticatedAs(User::find(1));
}
Performance
For large user bases, eager-load relationships in getImpersonateUIUsers:
public function getImpersonateUIUsers()
{
return self::with('roles')->whereHas('roles', function($q) {
$q->where('name', '!=', 'banned');
})->get();
}
How can I help you explore Laravel packages today?