Laravel Impersonate — Как выдавать себя за других пользователей

Источник: «Learn how to impersonate users in your Laravel app»
Одной из интересных особенностей Laravel Nova является возможность выдавать себя за пользователя прямо из панели управления. Это удобно по многим причинам, но я считаю, что когда вы получаете сообщение об ошибке или проблеме и хотите увидеть, что именно видит пользователь, выдача себя за него экономит массу времени, поскольку вы можете увидеть именно то, что видит пользователь.

Если вы хотите настроить эту функцию в своём 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 вы найдёте более подробную информацию.

Дополнительные материалы

Предыдущая Статья

События в Laravel

Следующая Статья

Новое в Symfony 6.4: DatePoint