Skip to content

Instantly share code, notes, and snippets.

@MACscr
Created January 20, 2022 11:01
Show Gist options
  • Save MACscr/75205a54789520640e09554eb597a1f8 to your computer and use it in GitHub Desktop.
Save MACscr/75205a54789520640e09554eb597a1f8 to your computer and use it in GitHub Desktop.
Filament User Impersonation Button that works on User Edit/View Page
<?php
## bottom of EditUser.php. Could be on View as well.
protected function getActions(): array
{
return array_merge([
ImpersonateButton::make('impersonate'),
], parent::getActions());
}
<?php
namespace STS\FilamentImpersonate;
use Filament\Facades\Filament;
use Filament\Pages\Actions\ButtonAction;
use Illuminate\Http\RedirectResponse;
use Lab404\Impersonate\Services\ImpersonateManager;
use Livewire\Redirector;
class ImpersonateButton extends ButtonAction
{
protected function setUp(): void
{
$this
->action(fn () => static::impersonate($this->getLivewire()->record))
;
}
public function isHidden(): bool
{
return !static::allowed(Filament::auth()->user(), $this->getLivewire()->record);
}
public static function leave(): bool | Redirector | RedirectResponse
{
if (!app(ImpersonateManager::class)->isImpersonating()) {
return redirect('/');
}
app(ImpersonateManager::class)->leave();
session()->forget(array_unique([
'password_hash_'.config('filament-impersonate.guard'),
'password_hash_'.config('filament.auth.guard'),
]));
return redirect(
session()->pull('impersonate.back_to') ?? config('filament.path')
);
}
protected static function allowed($current, $target): bool
{
return $current->isNot($target)
&& !app(ImpersonateManager::class)->isImpersonating()
&& (!method_exists($current, 'canImpersonate') || $current->canImpersonate())
&& (!method_exists($target, 'canBeImpersonated') || $target->canBeImpersonated());
}
protected static function impersonate($record): bool | Redirector | RedirectResponse
{
if (!static::allowed(Filament::auth()->user(), $record)) {
return false;
}
app(ImpersonateManager::class)->take(
Filament::auth()->user(),
$record,
config('filament-impersonate.guard')
);
session()->forget(array_unique([
'password_hash_'.config('filament-impersonate.guard'),
'password_hash_'.config('filament.auth.guard'),
]));
session()->put('impersonate.back_to', request('fingerprint.path'));
return redirect(config('filament-impersonate.redirect_to'));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment