Laravel Impersonate — Как выдавать себя за других пользователей
Если вы хотите настроить эту функцию в своём Laravel приложении, то пакет Laravel Impersonate позволяет сделать это очень просто. Вот как начать работу.
Шаг 1. Требования и настройка пакета
Как и для всех других пакетов, требуется composer:
composer require lab404/laravel-impersonate
Далее откройте файл config/app.php
и добавьте его в массив providers
:
'providers' => [
// ...
Lab404\Impersonate\ImpersonateServiceProvider::class,
],
После этого откройте Models/User
и добавьте трейт:
use Lab404\Impersonate\Models\Impersonate;
class User extends Authenticatable
{
use Impersonate;
Шаг 2. Маршруты имперсонации
Пакет Laravel Impersonate включает в себя несколько способов имперсонации пользователя, но мне показалось, что проще всего использовать их макрос routes
, добавив его в файл routes/web.php
.
Route::impersonate();
Это позволяет получить несколько именных маршрутов:
// Где $id - идентификатор пользователя, за которого вы хотите себя выдать.
route('impersonate', $id)
// Или в случае нескольких "охранников" необходимо также добавить `guardName` (по умолчанию `web`).
route('impersonate', ['id' => $id, 'guardName' => 'admin'])
// Генерирование URL-адреса для выхода из текущего пользователя
route('impersonate.leave')
Шаг 3. Использование имперсонации в Laravel Blade
Теперь, когда все настройки Laravel Impersonate выполнены, можно использовать несколько хелперов для Blade:
@canImpersonate($guard = null)
<a href="{{ route('impersonate', $user->id) }}">Impersonate this user</a>
@endCanImpersonate
Затем — обратное:
@impersonating($guard = null)
<a href="{{ route('impersonate.leave') }}">Leave impersonation</a>
@endImpersonating
Шаг 4. Расширенная настройка
Ещё один момент, который вы, возможно, захотите рассмотреть, — это настройка опций для ограничения того, кто может выдавать себя за других пользователей, и того, за каких пользователей можно выдавать себя. В разделе Models/User
можно добавить следующие методы:
/**
* По умолчанию все пользователи могут выдавать себя за кого угодно,
* в данном примере это ограничено тем, что только администраторы
* могут выдавать себя за других пользователей
*/
public function canImpersonate(): bool
{
return $this->is_admin();
}
/**
* По умолчанию все пользователи могут выдавать себя за других,
* это ограничивает эту возможность только определёнными пользователями.
*/
public function canBeImpersonated(): bool
{
return ! $this->is_admin();
}
Использование имперсонации в Laravel Jetstream
При использовании этого пакета в продакшне с Laravel Jetstream я столкнулся с проблемой, когда он работал нерегулярно, и если вы столкнулись с этой проблемой, попробуйте добавить эту рекомендацию в ваш 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);
});
}
Заключение
В целом, пакет Laravel Impersonate включает в себя все необходимое для удобного входа в систему под именем других пользователей и представляет простой способ добавления этой функции в ваше приложение. Если вы хотите узнать больше о пакете и его расширенных возможностях, ознакомьтесь с пакетом, а в файле readme.md
вы найдёте более подробную информацию.